javascript中可处理的浮点数的最高精度(和小数的一些小特性)
1.之前在度娘那找了一下关于javascript中可处理的浮点数的最高精度的问题,但找了好久也找不到,于是自己 小小的研究了一下,之前以为是17,后来测到18,再后来又测到19,经过一系列的改写,得到下面的相对完善的检测方案:
<script>
//返回数字数组中的最大值
function arrMax(arr)
{
return Math.max.apply({}, arr);
}
//10万个随机小数中的最大精度
function maxDec()
{
var arr = [];
var dec = 0;
var len = 0;
var num = 0; //取得10万个随机小数的小数位精度,如果直接100万个会报错,浏览器不给循环这么多次,所以就来个10万次
for(var i=0; i<100000; i++)
{
dec = Math.random(); //随机小数
len = dec.toString().split('.')[1].length; //获取上面得到的随机小数的小数位长度
arr.push(len); //用数组把这个长度存起来
}
//返回这10万个中最大的
return arrMax(arr);
} //上面的10万个有点少,再来个100循环,就是1千万了
var temp = [];
for(var i=0; i<100; i++)
{
temp.push(maxDec())
}
alert(arrMax(temp)) //多执行几次,最大的不超过22,所以JS可以处理的小数最高精度为22 位;如果您测到比22大的,一定要告诉下我啊~~~ </script>
//上面有bug,不正确,大家还是忽略上面的结论,看下面的吧....
2.小数的小特性
先问大家几个问题:1 * 0.1等于多少呢? 2*0.1等于多少呢? 那3*0.1等于多少呢? (此时此刻你是不是想说:坑爹的,你坑我啊!)哈哈,请耐心看下下面的代码:
<script>
for(var i=1; i<=10; i++)
{
var res = i * 0.1;
console.log(i + '*0.1= ' + res);
} /* 1*0.1= 0.1
2*0.1= 0.2
3*0.1= 0.30000000000000004
4*0.1= 0.4
5*0.1= 0.5
6*0.1= 0.6000000000000001
7*0.1= 0.7000000000000001
8*0.1= 0.8
9*0.1= 0.9
10*0.1= 1 */
</script>
你是否惊讶的发现, 3*0.1 竟然是等于0.30000000000000004, 坑啊!!!
揭秘: 其实,不紧紧是JS, 所有的计算设备都有这样的问题, 因为 根本不存在完全精确的小数, 10/3 =0.33333333333333..... 程序根本存不了这么多小数, 而是有范围的, 这些小数都是模拟出来的, 银行中的程序不是以元为单位的,你看到的100.23元,
在他的程序后面其实是10023分;
所以,尽量避免小数的出现,如果出现的话,想办法转成整数处理。以后会研究研究怎样尽可能小的减少精度损失。
欢迎拍砖,觉得好的请点下推荐~~(之前有些笔误,现在改好了)
javascript中可处理的浮点数的最高精度(和小数的一些小特性)的更多相关文章
- 如何解决JavaScript中0.1+0.2不等于0.3
console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...
- JavaScript中的 NaN 与 isNaN
NaN NaN 即 Not a Number ,不是一个数字. 在 JavaScript 中,整数和浮点数都统称为 Number 类型 .除此之外,Number 类型还有一个很特殊的值,即 NaN . ...
- JavaScript 中的 NaN 和 isNaN
1.NaN NaN 即 Not a Number , 不是一个数字.那么 NaN 到底是什么呢? 在 JavaScript 中,整数和浮点数都统称为 Number 类型 .除此之外,Number 类型 ...
- 前端学习之JavaScript中的 NaN 与 isNaN
NaN NaN 即 Not a Number ,不是一个数字. 在 JavaScript 中,整数和浮点数都统称为 Number 类型 .除此之外,Number 类型还有一个很特殊的值,即 NaN . ...
- 【javascript】javascript中function(){},function(){}(),new function(){},new Function()
和java比起来,javascript真的是松散的无以复加,不过这也让我们在无聊之余,有精力去探讨一些复杂的应用,从而在开发之路上,获得一些新的想法. javascript中的类的构造 javascr ...
- javascript 中function(){},new function(),new Function(),Function 摘录
函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的关系. function使用方式 var foo01 = ...
- javascript 中function(){}(),new function(),new Function(),Function
和java比起来,javascript真的是松散的无以复加,不过这也让我们在无聊之余,有精力去探讨一些复杂的应用,从而在开发之路上,获得一些新的想法. javascript中的类的构造 javascr ...
- JavaScript 中JSON
JSON是JavaScript Object Notation的缩写,它是一种数据交换格式. 在JSON出现之前,大家一直用XML来传递数据.因为XML是一种纯文本格式,所以它适合在网络上交换数据.X ...
- javascript中的浮点数运算
解释一下下面代码的输出 console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 == 0.3); //false Jav ...
随机推荐
- sublime快捷键收藏
快速查找(ctrl + P)输入@+函数名可以快速找到函数.输入#+文本可以快速进行文件内文本匹配.3. 多行游标功能(ctrl + D,非常实用)如何将文件中的某个单词更改为另一个?方法一:利用查找 ...
- eclipse 使用mvn模块化开发
1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->nex ...
- SqlDataReader类
一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度. FieldCount 获取当前行中的列数. HasRows 获取一个值,该值指示 SqlDataReader 是否有行. ...
- House Robber II 解答
Question After robbing those houses on that street, the thief has found himself a new place for his ...
- (转)Java 的swing.GroupLayout布局管理器的使用方法和实例
摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...
- Unix命令行学习
Listing files and directories ls 显示你当前目录的文件 ls -a 显示你千亩目录的文件(包括隐藏文件)ls <name1>/<name2> 显 ...
- #include<math.h>
1.sin(a)类:a是弧度值: 2.abs(b):结果是b的绝对值: 3.exp(c):exp()用来计算以e为底的x次方值,即ex值,然后将结果返回.返回值: 返回e的x次方计算结果. 4.log ...
- vector的内存分配与释放
1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...
- Cocos2d-x3.1UserDefaule类具体解释
在Cocos2d-x存储数据使用的类是UserDefault类,以下分析下该类的使用 //.h #include "base/CCPlatformMacros.h" #includ ...
- CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径
推荐一篇炒鸡赞的blog. 以下代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring& ...