可能重复:
strange output in comparision of float with float literal浮点问题用C
float a = 0.7;
if (a < 0.7) ;
为什么这里的表达式计算结果为真?
可能重复:
strange output in comparision of float with float literal浮点问题用C
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(默认值)表示时向下舍入一点点。
因为字面0.7是double类型的,而不是浮动。的实际值是0.699999 ...修复:
if (a < 0.7f)
a的实际值是0.699999 ...假设可以是0.699999 ... :) – 2010-10-12 15:59:54
其他的答案暗示,但是,这个问题是由于你不加入一个“F”你的号码引起的。
任何带小数点的数字都会被编译器隐式解释为double(即64位值的精度是float的两倍)。在你的第一行中,你将一个double赋值给一个float,从而失去了精度(如果你打开了警告,你应该有警告,你会得到一个编译器警告)。
在第二行中,您将float与double进行比较。浮动将被提升为双倍(如果我错了,就纠正我),所以你有0.7的不精确版本,而更精确的0.7。
解决方案:用浮漂打交道时,即
float a = 0.7f;
if (a < 0.7f);
务必用 “F” 试试这个:在most effective way for float and double comparison
float a = 0.7f;
if (fabs(a - 0.7f) < numeric_limits<float>::epsilon) ;
更多细节。
阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic
每计算机程序员必须知道这一点。
http://docs.sun.com/source/806-3568/ncg_goldberg.html – DumbCoder 2010-10-12 15:42:47