C语言中浮点数的意外行为

C语言中浮点数的意外行为,c,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) {

我有一个简单的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();
}
然后它也显示为输出不相等!因为0.2是精确值的1/5,所以输出应该相等


有人能告诉我这里有什么不对吗?

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

阅读任何有关浮点数的基本文本。我理解这一点,因为计算机将0.3视为1/3:为什么要这样做?和0.333。。。不等于0.33,0.33从何而来?@Deduplicator我在网上搜索了一下,发现了一些关于截断错误的结果。但是,好的,1/5没有给出任何截断错误。@krupalshah将1/5转换为十进制,你会看到它确实也被截断了。但是如果您使用.25、.125、.0625等,它不会被截断。如果您绝对需要与文本进行比较,则应该使用double或cast文本来浮动,因为它们是double类型的。谢谢…我会接受的。请参阅重复数据消除程序链接到的上一个问题,以获得更长、更完整、更复杂的答案。
float b=0.2;
if(b==0.2)
{
    printf("equal");
}
else
{
    printf("unequal");
}