相似的代码输出不同的结果

Moh*_*lah 2 c floating-point double

以下代码的输出是0.0000000

#include <stdio.h>

int main() {
    float x;
    x = (float)3.3 == 3.3;

    printf("%f", x);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而此代码输出1.000000

int main() { 
    float x; 
    x = (float)3.5 == 3.5; 

    printf("%f", x); 

    return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

2个代码唯一的区别是比较中的值,但是结果不一样,这是为什么呢?

dbu*_*ush 5

这一行:

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

比较(float)3.33.3是否相等并将结果分配给x。由于转换,比较的左侧具有类型float,而右侧具有类型double,这是浮点常量的默认类型。

值 3.3 不能用二进制浮点精确表示,因此存储的实际值是一个近似值。由于类型floatdouble精度不同,此近似值将有所不同,因此相等性将评估为 false,即 0。这是分配给 的值x

关于x当您检查的数字是 3.5 时为什么是 1 的评论,那是因为 3.5可以用二进制精确表示,并且两种类型都具有存储该值的精度,因此它们比较相等。