If-else使用float数据类型阻塞和意外结果.[编辑另外一个问题]

Nar*_*aki 1 c types if-statement literals

我使用gcc 4.4.1编译了以下程序,我得到了意想不到的输出(好吧,对我来说意外)

#include<stdio.h>

int main()
{
        float x=0.3, y=0.7;

        if(x==0.3)
        {
                if(y==0.7)
                        printf("Y\n\n");
                else
                        printf("X\n\n");
        }
        else
                printf("NONE\n\n");
}


Output: NONE
Run Code Online (Sandbox Code Playgroud)
#include<stdio.h>

int main()
{
        float x=0.3, y=0.7;

        if(x<0.3)
        {
                if(y==0.7)
                        printf("Y\n\n");
                else
                        printf("X\n\n");
        }
        else
                printf("NONE\n\n");
}

Output: NONE
Run Code Online (Sandbox Code Playgroud)
#include<stdio.h>

int main()
{
        float x=0.3, y=0.7;

        if(x>0.3)
        {
                if(y>0.7)
                        printf("Y\n\n");
                else
                        printf("X\n\n");
        }
        else
                printf("NONE\n\n");
}

    Output:X
Run Code Online (Sandbox Code Playgroud)

因此,可以清楚地看到"x"中的存储值大于0.3,"y"中的存储值小于0.7

为什么会这样?这是float数据类型的属性还是if-else语句以不同的方式解释float?

谢谢.


编辑:好吧,我思索着它,现在我有点困惑.请告诉我对这个问题的理解是否正确.

float x=0.3;
Run Code Online (Sandbox Code Playgroud)

这存储x=0.30000001192092895508在内存中.显然,这大于0.3(这是正确的吗?)

现在,double x=0.3结果x=0.29999999999999998890和小于0.3(这也是正确的吗?)

主要问题:因此,如果我使用store 0.3in float x,则以下语句将if(x>0.3)导致x=0.30000001192092895508隐式转换为double,0.3也是double而不是float.因此0.3=0.29999999999999998890,内部运作是if((double) 0.30000001192092895508 > (double) 0.29999999999999998890).它是否正确?

Jon*_*eet 7

您正在使用float存储,但是您正在对类型的文字进行比较double.

的值xy不完全0.3和0.7,如那些号码不在二进制浮点数表示的.碰巧最接近float0.3大于最接近double0.3,最接近float0.7小于最接近double0.7 ...因此您的比较结果.

假设表示与C#中的表示相同(我碰巧有一些工具可以帮助),所涉及的值是:

0.3 as float = 0.300000011920928955078125
0.3 as double = 0.299999999999999988897769753748434595763683319091796875
0.7 as float = 0.699999988079071044921875
0.7 as double = 0.6999999999999999555910790149937383830547332763671875
Run Code Online (Sandbox Code Playgroud)

这就解释了它为什么会发生......但它并没有解释如何解决问题,无论你的代码实际上是在做什么,当然.如果您可以为更大的问题提供更多背景信息,我们可以提供更多帮助.