JavaScript减法运算结果不准确-为什么?

3

我这里有一个示例:http://jsfiddle.net/94wQJ/1/ - 但可能只需查看下面的内容,就可以给出建议。

<button type="button" id="allocate">Calc</button>

 $('#allocate').click(function () {
     val1 = 25.00;
     val2 = 16.37;
     val3 = val1-val2;
     alert(val3);
 });

25 - 16.37 = 8.63,但是val3的警报显示为8.62999999999。

为什么不准确?

谢谢,

马克


1
这里有一些好的信息 https://dev59.com/G3RB5IYBdhLWcg3wj36c - andy mccullough
详细讨论请参见以下链接:https://dev59.com/Smgt5IYBdhLWcg3wwwO- 和 https://dev59.com/bms05IYBdhLWcg3wQvyq - hima
4个回答

5

谢谢Ram,一旦SO允许,我会标记为答案。奇怪的行为!!干杯,Mark - Mark
1
@MarkTait - 这不是奇怪的行为 - 这是由于浮点数的已知限制所致。 - Ed Heal

3

为什么它不准确?

这是重复的问题Is floating point math broken?,但是回答您的特定问题:浮点数通常以2进制存储数字,因为使用2进制可以更准确地存储更多数字,而使用10进制则不能准确地存储所有10进制数字,即使只有很少的小数位。


这不仅仅是Javascript的浮点数运算 - 除非您使用专门的Decimal类,否则它适用于所有浮点数运算。 - sevenseacat
@sevenseacat:是的,同意。你可以进一步说,这是关于在特定位数的比特中可以存储多少信息的限制,但我无法引用哪个信息理论的部分适用。 - Douglas

1
许多十进制小数无法在二进制中精确表示。 使用 .toFixed(2)

1
请检查这个
val3 = Math.round(val3*100)/100;
我在这里更新了http://jsfiddle.net/94wQJ/7/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接