为什么乘以N除以N"修复"浮点表示?

时间:2014-06-11 20:54:33

标签: javascript math floating-point floating-point-precision

我正在使用JavaScript,但问题是通用的。采取这种舍入错误:

>> 0.1 * 0.2
0.020000000000000004

This StackOverflow answer提供了一个很好的解释。实质上,某些十进制数不能精确地表示为二进制数。这很直观,因为1/3在base-10中有类似的问题。现在可以解决这个问题:

>> (0.1 * (1000*0.2)) / 1000
0.02

我的问题是这是如何运作的?

3 个答案:

答案 0 :(得分:4)

没有。请尝试使用0.6840.03,这个技巧实际上会让情况变得更糟。或0.220.99。或者其他很多东西。

答案 1 :(得分:4)

它不起作用。您看到的不是完全 0.02,而是一个足够接近(至15位有效十进制数字)的数字。

恰好将操作数乘以1000,然后将结果除以1000,会导致舍入错误,从而产生明显的"正确的"结果

您可以在浏览器的控制台中看到自己的效果。使用Number.toString(2)将数字转换为二进制,您将看到差异:

Console showing <code>0.1</code>, <code>0.2</code>, <code>0.1*0.2</code> and <code>((0.1*(0.2*1000))/1000</code> each with their binary representations

相关并不意味着因果关系。

答案 2 :(得分:0)

由于数字是常量,因此可以在将数字赋给变量之前计算表达式,因此除了存储表达式结果的变量之外,不需要使用浮点变量。