可能重复:
Most effective way for float and double comparison
strange output in comparison of float with float literal
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)
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
答案 1 :(得分:6)
if (a==0.8f)
试试这个。默认情况下,类型被认为是double,相比之下会出现精度错误。
答案 2 :(得分:3)
你使用的是文字,0.8,但这并不一定意味着它是一个浮点数。尝试使用:
if (a==0.8F)
代替
此外,由于计算机内部使用base-2,因此代表数字的小数部分非常容易出错。
答案 3 :(得分:1)
浮点数不是精确值。你不应该使用==和!=来比较它们。使用大于和小于运算符的一些相当小的epsilon:
if ((a > 0.79) && (a < 0.81))
答案 4 :(得分:0)
这是因为浮点数不能精确地表示小数,因此它不完全是0.8。而且你将0.8舍入为浮点数与0.8舍入为小数,这两者不一定相同。
答案 5 :(得分:0)
花车并不总是100%准确,它们不能因为它们存储的方式而存在。如果您说float a = 0.8
,则可能真的是0.800000000001
或类似的东西。为了弥补这一点,您应该使用某种阈值。尝试if (fabs(a-0.8) < 1.0e-5)
而不是
答案 6 :(得分:0)
因为浮点数0.8并不意味着0.8,但它是0.799999999所以它发生了
为什么是0.79999999
这取决于浮点值的存储。十进制值将以二进制形式存储(....,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)
答案 7 :(得分:0)
您要比较不同类型的2个值:a
类型为float
,0.8
类型为double
。
在比较之前,float
值会转换为double
...但是从double
转换为float
并返回不一定会产生相同的值< / p>
if (0.8 == (double)(float)0.8) /* ... */