int i = 0;
double n = 1.24;
for (; int(n) != n; i++) {
n *= 10;
}
为什么进入无限循环?它不应该在两次循环后停止吗?
答案 0 :(得分:9)
1.24
无法完全表示为double
。如果您检查n
的初始值,您会看到它是1.239999999999999991118215802998747...
为什么循环永不停止,一旦n
超过最大double
的值,它就会自动转换为+Infinity
,这是一个特殊的浮点值。达到该点后,n
停止更改,int(n) != n
永远无法满足。
答案 1 :(得分:4)
因为double不是数字和条件的精确表示int(n)== n从未达到过。 阅读此http://en.wikipedia.org/wiki/Floating_point
答案 2 :(得分:1)
我已经尝试过了,它在两个循环之后停止了。我用过gcc。 我将int(n)更改为(int)n
由于某些舍入误差而发生无限循环,尝试检查(int)n和n之间的差异
一般情况下,不要同等地使用double检查相等性。改为使用
if(fabs(a-b)< 1e-10)//而不是== b