int main()
{
float a = 0.8;
if (a == 0.8)
printf("x\n");
else
printf("y\n");
return 0;
}
虽然a等于0.8,但它输出 y。
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)
试试这个。默认情况下,类型被认为是双精度误差比较。
您使用的是文字 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
这取决于浮点值的存储。十进制值将以二进制形式存储 (....,2^3,2^2,2^1,2^0,.,2^-1,2^-2,2^-3,.. .)
因此,当 0.8 以 2 的倍数存储为 .101b(不是 0.8 而是 0.799999988)时。因此它的值将小于 0.8。
if (a > 0.8)
这也是False
为什么。
为您的结果尝试
if (a == 0.8f)
您正在比较 2 个不同类型的值:a
is of type float
,0.8
is of type double
。
在比较之前,该float
值被转换为double
... 但从double
tofloat
和 back 转换不一定会产生相同的值
if (0.8 == (double)(float)0.8) /* ... */