我 刚看了MDN上的一篇文章,其中提到由于一切均为“双精度64位格式IEEE 754值”,JS处理数字的一个特点是当你执行类似.2 + .1
这样的操作时,你得到的结果是0.30000000000000004
(这是该文章中的说法,但我在Firefox中得到的结果是0.29999999999999993
)。因此:
(.2 + .1) * 10 == 3
评估结果为false
。
这似乎会引起很大问题。那么有什么方法可以避免由于JS中不精确的十进制计算而导致的错误?
我注意到如果你执行1.2 + 1.1
,你会得到正确的答案。所以是否应该避免涉及小于1的值的任何数学运算?因为那似乎非常不切实际。在JS中进行数学运算是否还存在其他危险?
编辑:
我理解许多十进制分数无法存储为二进制,但我遇到的大多数其他语言处理误差的方式(如JS处理大于1的数字)似乎更直观,所以我不太习惯这种情况,这就是为什么我想看看其他程序员如何处理这些计算的原因。
$ php -r 'var_dump((0.1 + 0.2) * 10 == 3);'
→bool(false)
:) 这段代码的含义是:将0.1与0.2相加,然后将结果乘以10,最后检查结果是否等于3。通过运行以上代码,我们可以看到输出为布尔值false
,说明该表达式不成立。 - deceze