有没有办法在Javascript中区分整数和非常接近的小数?

时间:2014-11-11 16:35:57

标签: javascript floating-accuracy floating-point-precision

查看那些评估(来自节点0.10.33的实际转储)

> parseFloat(2.1e-17) === parseInt(2.1e-17)
false
> parseFloat(2.1e-17 + 2) === parseInt(2.1e-17 + 2)
true
> parseFloat(2.000000000000000000000000000000000009) === parseInt(2.00000000000000000000000000000000000009)
true

如何将小数非常接近的整数告诉整数?

似乎JS(或至少V8)在进行计算时并不关心小于10 ^ -16的数字,即使语言(reference)使用的64位表示应该处理它

2 个答案:

答案 0 :(得分:2)

这是我从ReSharper那里学到的东西

而不是使用像

这样的表达式
 if (2.00001 == 2) {}

if (Math.abs(2.00001 - 2) < tolerance) {}

其中公差应该是一个值得支持的值,例如.001

所以差异小于.001的所有值都等于

你真的需要10 ^ -16精度我的意思是这就是为什么1000米= 1公里,只需改变输出的单位所以你不必使用所有那些小数

答案 1 :(得分:2)

你的例子很容易解释。首先要注意的是,parseInt()parseFloat()将字符串作为输入。因此,在实际解析之前,首先将输入转换为字符串。

第一个很容易看到:

> parseFloat(2.1e-17) === parseInt(2.1e-17)
false

// look at the result of each side
parseFloat(2.1e-17) == 2.1e-17
parseInt(2.1e-17)  == 2

当将字符串"2.1e-17"解析为整数时,解析将停在点处,因为它不是有效数字,并返回它在此之前找到的所有内容,这只是2

> parseFloat(2.1e-17 + 2) === parseInt(2.1e-17 + 2)
true

// look at the result of each side
parseFloat(2.1e-17 + 2) == 2
parseInt(2.1e-17 + 2)  == 2

此处将首先评估参数中的公式。由于浮点数学的局限性(尾数只有52位,不能代表2.000000000000000021),这只会产生2。因此parseX()函数都获得相同的整数参数,这将导致相同的解析数。

> parseFloat(2.000000000000000000000000000000000009) === parseInt(2.00000000000000000000000000000000000009)
true

与第二种情况相同的论点。唯一的区别是,不是公式,而是评估,这次它是JavaScript解析器,它将您的数字转换为2


总结一下:从JavaScript的角度来看,你的数字是一样的。如果需要更高的精度,则必须使用某些库来获得任意精度。