可能重复:
strange output in comparision of float with float literal
float a = 0.7;
if (a < 0.7) ;
为什么这里的表达式评估为true?
答案 0 :(得分:5)
浮点数的精度有限。 0.7最有可能无法准确表示,因此a中的值可能是浮点数的0.6999999999982左右。相比之下,双0.7(更精确:0.6999999999999999999999999384)将显示它更少。
答案 1 :(得分:4)
因为文字0.7是double类型,而不是float。 a的实际值是0.699999 ...修复:
if (a < 0.7f)
答案 2 :(得分:3)
其他答案暗示它,但是这个问题是由于你没有在你的号码中添加“f”而造成的。
任何带小数点的数字都将被编译器隐式解释为double(即64位值,其精度是浮点数的两倍)。在你的第一行,你给一个浮点数分配一个双精度,从而失去精度(如果你打开了警告,你应该有,你会得到一个编译器警告)。
在第二行中,您将浮点数与双精度值进行比较。浮动将被提升为双倍(如果我错了,请纠正我),因此与精确的0.7相比,你的精确度不如0.7。
解决方案:在处理浮动时总是使用“f”,即
float a = 0.7f;
if (a < 0.7f);
答案 3 :(得分:1)
因为0.7不能完全表示为float或double。当你将它存储在一个浮点数时,它会比它表示为双精度(默认值)时向下舍入一点。
答案 4 :(得分:1)
试试这个:
float a = 0.7f;
if (fabs(a - 0.7f) < numeric_limits<float>::epsilon) ;
答案 5 :(得分:0)
阅读本文: What Every Computer Scientist Should Know About Floating-Point Arithmetic
每个计算机程序员都必须知道这一点。