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

时间:2012-08-14 16:33:46

标签: c

  

可能重复:
  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。

8 个答案:

答案 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类型为float0.8类型为double

在比较之前,float值会转换为double ...但是从double转换为float并返回不一定会产生相同的值< / p>

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