【发布时间】:2011-02-18 05:06:39
【问题描述】:
我just read on MDN JS 处理数字的怪癖之一是 “双精度 64 位格式 IEEE 754 值” 是当您执行类似 .2 + .1 的操作时你会得到0.30000000000000004(这就是文章的内容,但我在Firefox中得到0.29999999999999993)。因此:
(.2 + .1) * 10 == 3
计算为false。
这似乎很成问题。那么如何避免由于 JS 中的小数计算不精确而导致的错误呢?
我注意到,如果您选择1.2 + 1.1,您会得到正确的答案。那么,您是否应该避免任何涉及值小于 1 的数学运算?因为这看起来很不切实际。用 JS 做数学还有其他危险吗?
编辑:
我知道许多小数部分不能存储为二进制,但我遇到的大多数其他语言似乎处理错误的方式(如 JS 处理大于 1 的数字)似乎更直观,所以我不习惯这就是为什么我想看看其他程序员是如何处理这些计算的。
【问题讨论】:
-
浮点数几乎从来没有与任何语言的其他数字完美比较。
-
四舍五入是你的朋友。
-
@mellamokb:所以你必须将所有内容乘以 10 的幂,然后四舍五入到最接近的整数?
-
@Lèse
$ php -r 'var_dump((0.1 + 0.2) * 10 == 3);'→bool(false):) -
@mellamokb 好吧,我遇到了舍入问题。 0.5 应四舍五入为 1,但我得到的不是 0.5,而是 0.4999......8,它正在四舍五入为 0。
标签: javascript math decimal