为什么控制进入“其他”部分?

可能重复:
最有效的浮动和双重比较方式
与float和float文字相比较的奇怪输出

int main() { float a = 0.8; if (a == 0.8) printf("x\n"); else printf("y\n"); return 0; } 

虽然a等于0.8 ,但它输出y。

0.8不能在二进制浮点中准确表示。 您的代码if (a == 0.8)基本上将单精度0.8与双精度0.8进行比较,它们不相等。

要自己查看,请尝试以下代码:

 int main() { double a = 0.8f; double b = 0.8; printf("%lX\n", *(long *)&a); printf("%lX\n", *(long *)&b); } 

它输出:

 3FE99999A0000000 3FE999999999999A 
 if (a==0.8f) 

试试这个。 默认情况下,类型被认为是double,相比之下具有精度错误。

你使用的是文字,0.8,但这并不一定意味着它是一个浮点数。 尝试使用:

 if (a==0.8F) 

代替

此外,由于计算机内部使用base-2,因此代表数字的小数部分是出了名的错误。

浮点数不是精确值。 你不应该使用==和!=来比较它们。 使用大于和小于运算符的一些相当小的epsilon:

 if ((a > 0.79) && (a < 0.81)) 

这是因为浮点不能精确地表示小数,因此它不完全是0.8。 而且你将0.8舍入为浮点数与0.8舍入为小数,这些不一定相同。

浮动并不总是100%准确,它们不能因为它们的存储方式而存在。 如果你说float a = 0.8 ,那么a可能真的是0.800000000001或类似的东西。 为了弥补这一点,您应该使用某种阈值。 尝试if (fabs(a-0.8) < 1.0e-5)

因为对于浮点数0.8并不真正意味着0.8但它是0.799999999因此它发生为什么它是0.79999999
这取决于浮点值的存储。 十进制值将以二进制forms存储(….,2 ^ 3,2 ^ 2,2 ^ 1,2 ^ 0,。,2 ^ -1,2 ^ -2 ^ ^ -3,.. 。)

因此,当0.8以2的倍数存储为.101b(不是0.8而是0.799999988)时。其值将小于0.8。

 if (a > 0.8) 

这也是False原因。

为你的结果尝试

 if (a == 0.8f) 

您正在比较不同类型的2个值: afloat类型, 0.8double类型。

在比较之前, float值被转换为double …但是从double转换为float并且返回不一定产生相同的值

 if (0.8 == (double)(float)0.8) /* ... */