我正在使用JavaScript,但问题是通用的。采取这种舍入错误:
>> 0.1 * 0.2
0.020000000000000004
This StackOverflow answer提供了一个很好的解释。实质上,某些十进制数不能精确地表示为二进制数。这很直观,因为1/3在base-10中有类似的问题。现在可以解决这个问题:
>> (0.1 * (1000*0.2)) / 1000
0.02
我的问题是这是如何运作的?
答案 0 :(得分:4)
没有。请尝试使用0.684
和0.03
,这个技巧实际上会让情况变得更糟。或0.22
和0.99
。或者其他很多东西。
答案 1 :(得分:4)
它不起作用。您看到的不是完全 0.02
,而是一个足够接近(至15位有效十进制数字)的数字。
恰好将操作数乘以1000,然后将结果除以1000,会导致舍入错误,从而产生明显的"正确的"结果
您可以在浏览器的控制台中看到自己的效果。使用Number.toString(2)
将数字转换为二进制,您将看到差异:
相关并不意味着因果关系。
答案 2 :(得分:0)
由于数字是常量,因此可以在将数字赋给变量之前计算表达式,因此除了存储表达式结果的变量之外,不需要使用浮点变量。