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?