简单的加法会暴露 Javascript 引擎浮点错误

Phi*_*zen 5 javascript floating-point firefox internet-explorer google-chrome

在开发Measurement.js时,TDD 的乐趣帮助我偶然发现了 JavaScript 引擎中暴露的一种非常奇怪的行为(至少我是这样认为的)。

\n\n

无论是输入控制台还是在脚本内执行,都会发生以下情况:

\n\n
-1 + 0.85     --> -0.85               \xe2\x9c\x93  \n-1 + 1        --> 0                   \xe2\x9c\x93   \n-1 + 1 + -.15 --> 0.15                \xe2\x9c\x93\n-1 + 1.15     --> 0.1499999999999999  ?!?\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是在以下浏览器/操作系统下进行测试和准确复制的:

\n\n
    \n
  • FF 24.0(Debian 3.10)
  • \n
  • Chrome 30.0.1599.114(Debian 3.10)
  • \n
  • Chrome 30.0.1599.101m (Win7SP1)
  • \n
  • Internet Explorer 10.0.9200.16721 (Win7SP1)
  • \n
\n\n

由于这在不同的供应商中是一致的,我认为这一定有一个特定的原因,所以:

\n\n
    \n
  • 这是什么原因呢?
  • \n
  • 规避这种行为的最佳实践是什么,因为它给 JS 的精确计算带来了问题
  • \n
\n\n
\n\n

更新
\n最好的通俗易懂的解释,包括。到目前为止,多种编程语言的答案和解决方法可以在
\n http://floating-point-gui.de/找到 (感谢 @RocketHazmat)

\n

Nie*_*sol 0

不,呃。你尝试以二为基数进行数学计算。

简短的回答:你做不到。这就像尝试重复添加十进制的 1/3。你得到 0.333333,然后是 0.666666,然后是 0.99999...但是最后一个不应该是 3/3,换句话说就是 1 吗?

为了避免这个问题,请尽可能使用整数。

  • @Philzen:乘以 100,进行数学计算,然后除以 100。`(-100 + 115)/100 => 1.5`。或者使用“toFixed”:“(-1 + 1.15).toFixed(2)”。 (2认同)
  • @Philzen:查看此页面:http://floating-point-gui.de/ 它应该对此进行解释。 (2认同)