相同的浮点值比较为不等

时间:2014-07-20 17:58:54

标签: c floating-point

我正在研究一些'确定输出' C中的问题。我遇到了这个看起来很简单的问题,但在运行代码后让我感到困惑。

我预期的输出是" True"。但是在跑步时,它是错误的"。当我使用printf()检查f的值时,它显示为0.1。有人可以解释一下为什么f被赋予0.1并不能为IF语句返回true吗?

从我选择问题的地方找不到答案,我自己也找不到答案。

#include <stdio.h>

int main()
{
    float f = 0.1;
    if (f == 0.1)
        printf("True");
    else
        printf("False");
}

4 个答案:

答案 0 :(得分:9)

问题是变量f定义为类型为float而浮点常量0.1的类型为double。类型double的精度高于float类型的精度。它有更多的二进制数字来表示分数。所以在这个声明中

        float f = 0.1;

有一个截断。

要获得预期的结果,您至少应该写

        if (f == 0.1f)

另外,为了确保没有舍入,代码应该看起来像

#include <stdio.h>

int main( void )
{
    float f = 0.1f;

    if ( f == 0.1f )
        printf("True\n");
    else
        printf("False\n");
}

答案 1 :(得分:2)

这是因为浮动值的精确度。

选中此项: - What Every Computer Scientist Should Know About Floating-Point Arithmetic

你最好使用double而不是float。

另外要注意( WhozCraig正确指出),0.1是双倍而不是浮点数。将float更改为double,您将获得预期的输出。

答案 2 :(得分:1)

0.1无法用二进制表示。二进制文件中的0.1将是0.0r0011r,它会在内部重复出现,它会四舍五入,这不是确切的值。这就是它返回false的原因。但是,如果您尝试使用数字为0.5,即二进制0.1或0.250或0.125中的任何一个可以完美表示,它将返回true。另请阅读http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。最好使用double来获得更准确的结果。

答案 3 :(得分:1)

嗯,浮动类型有问题。检查如果使用double类型更改float,则会输出true而不是false。也尝试这个输出:

#include <stdio.h>

int main()
{
    float f;
    for(f=.0;f<10.;f+=0.1)
        printf("%f \n",f);    
}