【发布时间】:2010-10-12 15:40:09
【问题描述】:
可能重复:
strange output in comparision of float with float literal
float a = 0.7;
if (a < 0.7) ;
为什么这里的表达式计算结果为真?
【问题讨论】:
标签: c++ c floating-point
可能重复:
strange output in comparision of float with float literal
float a = 0.7;
if (a < 0.7) ;
为什么这里的表达式计算结果为真?
【问题讨论】:
标签: c++ c floating-point
浮点数的精度有限。 0.7 很可能无法准确表示,因此 a 中的值可能是浮点数中的 0.6999999999982 左右。这与双倍 0.7(更精确:0.69999999999999999999999999384)相比将表明它更少。
【讨论】:
因为字面量 0.7 是 double 类型,而不是 float。 a的实际值为0.699999...修复:
if (a < 0.7f)
【讨论】:
其他答案暗示了这一点,但这个问题是由于您没有在数字中添加“f”引起的。
任何带小数点的数字都会被编译器隐式解释为双精度数(即精度是浮点数两倍的 64 位值)。在您的第一行中,您将一个 double 分配给一个浮点数,从而失去精度(如果您打开了警告,您应该有,您会收到编译器警告)。
在第二行中,您将浮点数与双精度数进行比较。浮点数将提升为双精度(如果我错了,请纠正我),因此与更精确的 0.7 相比,0.7 的精度较低。
解决方案:处理浮点数时始终使用“f”,即
float a = 0.7f;
if (a < 0.7f);
【讨论】:
因为 0.7 不能精确地表示为浮点数或双精度数。当你将它存储在一个浮点数中时,它比它表示为双精度(默认值)时向下舍入一点。
【讨论】:
试试这个:
float a = 0.7f;
if (fabs(a - 0.7f) < numeric_limits<float>::epsilon) ;
【讨论】:
阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic
每个计算机程序员都必须知道这一点。
【讨论】: