C中的浮点问题

可能重复:
float与float文字的比较中的奇怪输出

float a = 0.7; if (a < 0.7) ; 

为什么这里的表达式评估为真?

浮点数的精度有限。 0.7最有可能无法准确表示,因此a中的值可能是浮点数的0.6999999999982左右。 这比较一个双0.7(更精确:0.6999999999999999999999999384)会显示它更少。

看看这个: http : //docs.sun.com/source/806-3568/ncg_goldberg.html

因为文字0.7是double类型,而不是float。 a的实际值是0.699999 …修复:

  if (a < 0.7f) 

其他答案暗示它,但这个问题是由于你没有在你的数字中添加“f”引起的。

任何带小数点的数字都将被编译器隐式解释为double(即64位值,其精度是float的两倍)。 在第一行中,为浮点数分配一个double,从而失去精度(如果你打开了警告,你应该有,你会收到编译器警告)。

在第二行中,您将浮点数与双精度值进行比较。 浮动将被提升为双倍(如果我错了,请纠正我),因此与精确的0.7相比,你的精确度不如0.7。

解决方案:在处理浮动时总是使用“f”,即

 float a = 0.7f; if (a < 0.7f); 

因为0.7不能完全表示为float或double。 当你将它存储在一个浮点数中时,它会比它表示为double(默认值)时向下舍入一点。

试试这个:

 float a = 0.7f; if (fabs(a - 0.7f) < numeric_limits::epsilon) ; 

更多细节以最有效的方式进行浮动和双重比较 。

阅读: 每个计算机科学家应该知道浮点运算

每个计算机程序员都必须知道这一点