简单的添加暴露了Javascript引擎浮点错误

时间:2013-10-24 19:02:09

标签: javascript internet-explorer google-chrome firefox floating-point

measurement.js工作时,TDD的乐趣帮助我偶然发现了一个非常奇怪的事情(至少我发生在我身上)在javascript引擎中暴露的行为。

无论是进入控制台还是在脚本中执行,都会发生这种情况:

-1 + 0.85     --> -0.85               ✓  
-1 + 1        --> 0                   ✓   
-1 + 1 + -.15 --> 0.15                ✓
-1 + 1.15     --> 0.1499999999999999  ?!?

这完全按照以下浏览器/操作系统进行测试和复制:

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

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

  • 这是什么原因?
  • 绕过这种行为的最佳做法是什么,因为它给使用JS
  • 的精确计算带来了问题

更新
最好的可理解的解释,包括。到目前为止,在多种编程语言的答案和解决方法 http://floating-point-gui.de/(thanx @RocketHazmat)

2 个答案:

答案 0 :(得分:0)

没有。你试着在二垒做数学。

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

要避免此问题,请尽可能使用整数。

答案 1 :(得分:0)

我认为这是因为在二进制中表示一些浮点数所固有的问题。

请阅读: - What Every Computer Scientist Should Know About Floating-Point Arithmetic.

尝试使用 toFixed 来避免您的问题

  

使用定点表示法格式化数字。