C中浮点数的意外行为

时间:2014-09-08 14:33:17

标签: c

我有一个简单的C片段如下:

#include<stdio.h>
#include<conio.h>

int main()    
{
    float a=0.3,b=0.5
    clrscr();

    if(a==0.3)
    {
        printf("equal");
    }
    else
    {
        printf("unequal");
    }

    if(b==0.5)
    {
        printf("equal");
    }
    else
    {
        printf("unequal");
    }

    getch();
}

将输出显示为:unequal equal

我理解这一点,因为计算机将0.3视为1/30.333...不等于0.33,它显示的输出不相等,而0.5则显示精确数字,因此它输出为equal

但是现在如果我像这样float b=0.2

float b=0.2;
if(b==0.2)
{
    printf("equal");
}
else
{
    printf("unequal");
}

然后它还显示unequal作为输出!由于0.21/5 - 精确值,因此应输出equal

有谁能告诉我这里有什么问题吗?

1 个答案:

答案 0 :(得分:2)

稍微简化一点,浮点数基本上存储为2的幂的一系列分数。(1 / 2,1 / 4,1 / 8,1 / 16,1 / 32,1 / 64等)。如果您的数字可以表示为某些数字的总和,那么您很幸运 - 对于大多数数字(1 / 3,1 / 5等),您会得到非常接近的近似值。比较完全相等的浮点数是充满危险的。