查看那些评估(来自节点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位表示应该处理它
答案 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的角度来看,你的数字是一样的。如果需要更高的精度,则必须使用某些库来获得任意精度。