C编程基础

时间:2014-01-06 10:00:56

标签: c

为什么下面给出的代码在屏幕上打印b?

#include<stdio.h>
main()
{
    float a = 5.6;
    if(a == 5.6)
    {
        printf("a");
    }
    else
    {
        printf("b");    
    }
}

3 个答案:

答案 0 :(得分:3)

由于浮点数不能完全匹配(因为您选择的每两个数字之间是无限其他数字)。机器不能代表它们全部,并且被强制用它能够代表的一些浮点数代表它们。

因此,在您的情况下,系统可能不存储5.6,因为这是您的机器不想表示的数字。相反,它将非常接近5.6的东西存储到内存中。

因此,如果您与浮点数进行比较,您永远不应该检查等值。相反,您应该使用系统C define FLT_EPSILON并检查

if (((a - 5.6) > -FLT_EPSILON) && ((a - 5.6) < FLT_EPSILON))
{
    ...
}

其中FLT_EPSILON是可表示的最小浮点类型值。 因此,如果从a到5.6的差异绝对小于EPSILON,你可以确定它是相同的,但是机器选择了它知道的下一个数字而不是5.6

同样是双重类型的DBL_EPSILON。

此类型在float.h

中定义

答案 1 :(得分:2)

如果您想要浮动值,请不要忘记添加f

#include<stdio.h>
main()
{
    float a = 5.6f;
    if(a == 5.6f)
    {
        printf("a");
    }
    else
    {
        printf("b");    
    }
}

按预期打印a

问题在于5.6被定义为double文字,而afloat中被转换为if&#39 ; s仍然将它与double值进行比较,这样你就会变错。

实际上只在if中添加f就足够了,但更安全然后抱歉。

答案 2 :(得分:0)

c中的浮点数默认为double。如果要使用float,则需要在数字末尾添加f。尝试下面的代码a

#include<stdio.h>
main()
{
    float a = 5.6;
    if(a == 5.6f)
    {
        printf("a");
    }
    else
    {
        printf("b");    
    }