为什么乘以和除以 N“固定”浮点表示?

gwg*_*gwg 5 javascript math floating-point floating-point-precision

我正在使用 JavaScript,但问题很普遍。取这个舍入误差:

>> 0.1 * 0.2
0.020000000000000004
Run Code Online (Sandbox Code Playgroud)

这个 StackOverflow 答案提供了一个很好的解释。本质上,某些十进制数不能用二进制精确表示。这是直观的,因为 1/3 在 base-10 中有类似的问题。现在解决方法是这样的:

>> (0.1 * (1000*0.2)) / 1000
0.02
Run Code Online (Sandbox Code Playgroud)

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

Nie*_*sol 4

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

碰巧的是,将操作数乘以 1000,然后将结果除以 1000,会导致舍入错误,从而产生明显“正确”的结果。

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

控制台显示 <code>0.1</code>、<code>0.2</code>、<code>0.1*0.2</code> 和 <code>((0.1*(0.2*1000))/1000</code>每个都有其二进制表示

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