-1

可能重复:
float 和 double 比较奇怪输出的最有效方法,
将 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。

4

8 回答 8

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
于 2012-08-14T16:36:16.540 回答
6
if (a==0.8f)

试试这个。默认情况下,类型被认为是双精度误差比较。

于 2012-08-14T16:36:12.703 回答
3

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

if (a==0.8F)

反而

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

于 2012-08-14T16:36:02.100 回答
1

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

if ((a > 0.79) && (a < 0.81))
于 2012-08-14T16:37:17.537 回答
0

这是因为浮点数不能准确地表示小数,所以它不完全是 0.8。并且您将 0.8 舍入为浮点数与 0.8 舍入为小数进行比较,这不一定相同。

于 2012-08-14T16:36:11.010 回答
0

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

于 2012-08-14T16:38:07.693 回答
0

因为对于浮点数 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) 
于 2012-08-14T16:38:36.403 回答
0

您正在比较 2 个不同类型的值:ais of type float0.8is of type double

在比较之前,该float值被转换为double... 但从doubletofloat和 back 转换不一定会产生相同的值

if (0.8 == (double)(float)0.8) /* ... */
于 2012-08-14T16:59:40.557 回答