为什么 JavaScript 在此小数值减法中返回错误结果?

And*_*ili -2 javascript javascript-objects

我是 JavaScript 的新手,我发现了一个非常奇怪的情况,正在做一个非常简单的数学运算:减法。

所以在一个 jQuery 函数中,我有这个代码:

saldoRicalcolato = finanziamento - variazioneAnticipoNumber;
Run Code Online (Sandbox Code Playgroud)

finanziamentovariazioneAnticipoNumber 2个数字为十进制数字。

除了某些特定值外,它几乎总是很好用。

您可以将执行此语句的奇怪行为复制到 FireBug 控制台中:

2205.88 - 1103.01
1102.8700000000001
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,结果基本上是错误的,因为我得到了1102.8700000000001而不是我预期的1102.87

为什么?我错过了什么?它是 JavaScript 引擎错误还是类似的东西?可能的?

Chr*_*ett 5

这不是 JavaScript 问题,而是更一般的计算机问题。浮点数无法正确存储所有十进制数,因为它们以二进制形式存储内容 例如:

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc
Run Code Online (Sandbox Code Playgroud)

所以在二进制 0.1 中是 0.00011 ......但这是无止境的。除了计算机必须在某个时候停止。因此,如果在我们的示例中,我们在 0.00011 处停止,我们将得到 0.09375 而不是 0.1。

它不取决于哪种语言,而取决于计算机,取决于语言的是您如何显示数字。通常该语言会将数字四舍五入为可接受的表示,但显然 JavaScript 不会。

如果您想获得1102.87. 您需要2使用以下方法将小数位设置为toFixed()

这只是获得您想要的号码的解决方案。

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc
Run Code Online (Sandbox Code Playgroud)