2010-10-12 56 views

回答

5

浮点数的精度有限。 0.7最有可能无法准确表示,因此a中的值可能为0.6999999999982左右。相比之下,双倍0.7(更准确地说:0.6999999999999999999999999384)将表明它更少。

检查了这一点:http://docs.sun.com/source/806-3568/ncg_goldberg.html

1

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

4

因为字面0.7是double类型的,而不是浮动。的实际值是0.699999 ...修复:

if (a < 0.7f) 
+0

a的实际值是0.699999 ...假设可以是0.699999 ... :) – 2010-10-12 15:59:54

3

其他的答案暗示,但是,这个问题是由于你不加入一个“F”你的号码引起的。

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

在第二行中,您将float与double进行比较。浮动将被提升为双倍(如果我错了,就纠正我),所以你有0.7的不精确版本,而更精确的0.7。

解决方案:用浮漂打交道时,即

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