2015-08-14 97 views
-1

考虑空两个片段输出原因?

int main() { 
    float a = 1.5; 
    if(a == 1.5) cout << "Yes\n"; 
    else cout << "No\n"; 
    return 0; 
} 

输出:是的。

int main() { 
    float a = 0.7; 
    if(a == 0.7) cout << "Yes\n"; 
    else cout << "No\n"; 
    return 0; 
} 

输出:第

为什么输出两个情况不同? 我知道,默认情况下,浮点常量是double,所以float(a)和double(0.7)之间的第二个片段中的比较变为false,输出是No。但我无法弄清楚为什么输出为Yes第一个片段。请帮忙!

+0

用'double'尝试它更有趣:文字可以有效地以比'double'更高的精度来表示。 – Bathsheba

回答

1

这样做的原因是,大多数花车并没有存储在计算机中的确切值。所以在花车上使用平等不是一个好主意。你应该做的是检查两个花车之间的差异是否小于阈值。喜欢的东西:

if (abs(a - 0.7) < 0.00001) 
    cout << "Yes" 
else 
    cout << "No" 

的原因,你的平等是在前面的情况下,真正的是1.5可以精确地表示为浮动,而0.7不能。为了理解原因,你应该看看浮点数存储在内存中的方式。另一种思路是1.5的二进制表示为小数点前一位的部分为1,小数点后一位的部分为1,而二进制的0.7在小数点后将有一个永不终止的序列。如果你不能把它写在纸上,你甚至希望将所有这些无限位存储在内存中(更不用说64位了)。

看看这个链接,为什么浮动不能存储为确切的数字:Why Are Floating Point Numbers Inaccurate?

+2

你的代码片段严重瑕疵。当它应该是'(1.5 - eps user463035818

+0

好吧,现在的数字是'0.7'而不是'1.5',但问题依然如此 – user463035818

+0

@ tobi303非常感谢。真是愚蠢的我。这就是我所解释的,平等在1.5但不是0.7 – therainmaker