为什么 JavaScript return 我在这个小数减法中得到了错误的结果?
Why JavaScript return me a wrong result in this subtraction of decimals values?
我是 JavaScript 的新手,我在做一个非常简单的数学运算时发现了一个非常奇怪的情况:减法。
所以在 jQuery 函数中我有这个代码:
saldoRicalcolato = finanziamento - variazioneAnticipoNumber;
其中 finanziamento 和 variazioneAnticipoNumber 是 2 numbers 具有十进制数字。
除了某些特定值外,它几乎总是很好。
您可以将执行此语句的奇怪行为复制到 FireBug 控制台中:
2205.88 - 1103.01
1102.8700000000001
所以在这种情况下,结果基本上是错误的,因为我得到的是 1102.8700000000001 而不是我预期的 1102.87 。
为什么?我错过了什么?是 JavaScript 引擎错误还是类似的问题?可能吗?
这不是 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
所以二进制 0.1 是 0.00011...
但这是无止境的。除了计算机必须在某个时候停止。因此,如果在我们的示例中我们在 0.00011 处停止,我们将得到 0.09375 而不是 0.1。
这不取决于哪种语言,而是在计算机上,取决于语言的是您如何显示数字。通常该语言会将数字四舍五入为可接受的表示形式,但显然 JavaScript 不会。
如果您想要 1102.87
。您需要使用 toFixed()
将小数位设置为 2
这只是获取所需号码的解决方案。
alert((2205.88 - 1103.01).toFixed(2));
我是 JavaScript 的新手,我在做一个非常简单的数学运算时发现了一个非常奇怪的情况:减法。
所以在 jQuery 函数中我有这个代码:
saldoRicalcolato = finanziamento - variazioneAnticipoNumber;
其中 finanziamento 和 variazioneAnticipoNumber 是 2 numbers 具有十进制数字。
除了某些特定值外,它几乎总是很好。
您可以将执行此语句的奇怪行为复制到 FireBug 控制台中:
2205.88 - 1103.01
1102.8700000000001
所以在这种情况下,结果基本上是错误的,因为我得到的是 1102.8700000000001 而不是我预期的 1102.87 。
为什么?我错过了什么?是 JavaScript 引擎错误还是类似的问题?可能吗?
这不是 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
所以二进制 0.1 是 0.00011... 但这是无止境的。除了计算机必须在某个时候停止。因此,如果在我们的示例中我们在 0.00011 处停止,我们将得到 0.09375 而不是 0.1。
这不取决于哪种语言,而是在计算机上,取决于语言的是您如何显示数字。通常该语言会将数字四舍五入为可接受的表示形式,但显然 JavaScript 不会。
如果您想要 1102.87
。您需要使用 toFixed()
2
这只是获取所需号码的解决方案。
alert((2205.88 - 1103.01).toFixed(2));