3个变量之和:奇怪的行为

可能重复:
JavaScript的数学是否被破坏?
为什么十进制数不能完全用二进制表示?

下一个代码的结果是什么:

if(0.3 == ( 0.1 + 0.1 + 0.1 ))
{
      alert(true);
}
else
{
      alert(false);
}

这很奇怪,但结果是错误的。

原因是这样的结果

0.1 + 0.1 + 0.1

将会

0.30000000000000004

如何解释这种行为?


解释很简单 - 阅读浮点数问题


这也是1/3 + 1/3 + 1/3可能不会给你十进制数字1的原因。 如果你使用1/3作为.33333333,那么1/3 + 1/3 + 1/3会给你.9999999 ,这不完全是一个。

除非您确切知道自己在做什么,否则请勿比较非整数数字类型的相等性。


你遇到的是一个基本的浮点舍入错误。

由于二进制数的性质,我们不能精确地表示0.1而没有一些错误。 WolframAlpha报告十进制0.1到二进制〜0.00011001100110011 ...请注意它如何不能在二进制数系统中有限地表示? 这意味着我们必须决定停止计算这个数字的切点,否则我们会永远在这里。

这引入了一个错误。 而且这个错误已经累积,因为代码会将数字加在一起,导致数量惊人的增加到您的总和的末尾。 这确保总和永远不会是0.3,这是IF测试正在寻找的。

然而,一些十进制数可以用二进制精确表示,例如dec 0.5 = bin 0.1和dec 0.25 = bin 0.01。

我们可以通过使用0.5 =(0.25 + 0.25)来证明这与您的原始代码类似。


为了进一步阅读,我推荐“浮点指南”

它提供了浮点数的概念以及如何计算错误的良好概述。 还有一个关于Javascript的部分,它演示了如何克服你遇到的舍入错误。

链接地址: http://www.djcxy.com/p/27497.html

上一篇: Sum of 3 variables: strange behavior

下一篇: How can I make a UITextField move up when the keyboard is present?