为什么JavaScript在这个小数值减法中给我一个错误的结果呢?

时间:2016-01-15 12:52:52

标签: javascript javascript-objects

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

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

saldoRicalcolato = finanziamento - variazioneAnticipoNumber;

其中 finanziamento variazioneAnticipoNumber 是2个数字,具有十进制数字。

除了一些特定的值之外,它几乎总是很好。

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

2205.88 - 1103.01
1102.8700000000001

所以在这种情况下结果是非常错误的,因为我得到 1102.8700000000001 而不是 1102.87 ,正如我预期的那样。

为什么呢?我错过了什么?它是一个JavaScript引擎错误还是这样的?可能的?

1 个答案:

答案 0 :(得分:2)

这不是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。您需要使用2

将小数位设置为toFixed()

这只是获得所需数字的解决方案。



alert((2205.88 - 1103.01).toFixed(2));