该程序打印"hello"而不是"Hi".怎么样?

sou*_*ale 0 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; 
}
Run Code Online (Sandbox Code Playgroud)

这个程序不应该显示Hi而不是hello0.7等于0.7吗?

(我是C编程的新手)

Wea*_*ane 6

注意

float a = 0.7;
Run Code Online (Sandbox Code Playgroud)

double值转换0.7为a float然后

if(a == 0.7)
Run Code Online (Sandbox Code Playgroud)

转换adouble.

由于0.7无法在浮点中精确表示,因此floatdouble表示形式并不完全相同.

您可以强制编译器保持float这样状态

#include<stdio.h>

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

现在程序打印"Hi",因为它正在比较喜欢.


更一般地说,您必须非常警惕浮点比较的平等性

#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; 
}
Run Code Online (Sandbox Code Playgroud)

程序输出

Unequal
0.70000000000000007
0.69999999999999996