该程序打印“ hello”而不是“ Hi”。怎么样?

时间:2018-10-14 08:48:34

标签: c

下面是if和else的程序

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

int main()
{
    float a = 0.7; //a declared as float variable

    if(a == 0.7)  //why it takes only integral part of 0.7 
    {
        printf("Hi"); 
    }
    else
    {
        printf("hello"); 
    }

    return 0; 
}

此程序是否应显示Hi而不是hello,因为0.7等于0.7?

(我是C编程的新手)

2 个答案:

答案 0 :(得分:6)

请注意

float a = 0.7;

double0.7转换为float,然后

if(a == 0.7)

a转换为double

由于0.7不能精确地用浮点表示,因此floatdouble的表示形式并不完全相同。

您可以像这样强制编译器继续使用float

#include<stdio.h>

int main()
{
    float a = 0.7f;
    if(a == 0.7f)
    {
        printf("Hi"); 
    }
    else
    {
        printf("hello"); 
    }
    return 0; 
}

现在该程序打印“ Hi”,因为它与like进行比较。


通常,您必须非常警惕浮点数比较是否相等

#include<stdio.h>

int main()
{
    double d = 2.1;
    d /= 3.0;
    if(d == 0.7) {
        puts("Equal");
    }
    else {
        puts("Unequal");
    }
    printf("%.17f\n", d);
    printf("%.17f\n", 0.7);
    return 0; 
}

程序输出

Unequal
0.70000000000000007
0.69999999999999996

答案 1 :(得分:1)

如果您将 a 的数据类型更改为 double ,它将打印出嗨, 这是因为浮点常量存储在 double 中,非浮点常量存储在 long 中, double精度较高,float精度较低,double值存储在64位二进制文​​件中,float值存储在32位二进制文​​件中,如果您看到浮点数转换为二进制转换的方法,则将完全清楚。