比较 0.55 和 0.55f 时的错误结果

Wrong result when comparing 0.55 and 0.55f

在 C 中,0.55 == 0.55f 为假,而 0.5 == 0.5f 为真。为什么不同?

  1. 比较0.55:

    #include <stdio.h>
    int main() {
        if (0.55 == 0.55f)
            printf("Hi");
        else
            printf("Hello");
    }
    

    输出 Hello.

  2. 比较0.5:

    #include <stdio.h>
    int main() {
        if (0.5 == 0.5f)
            printf("Hi");
        else
            printf("Hello");
    }
    

    输出 Hi.

对于这两个代码片段,我预计 Hello
为什么会有这种差异?

0.5 是一个 dyadic rational 并且大小合适所以 0.5 正好是 one-half 作为 floatdouble .

0.55 则不同。 double 将存储该数字,其精度不低于 float,而且很可能更高。

在这两种情况下,float== 之前隐式转换为 double,但到那时已经发生任何截断。

您正在比较两种不同类型的值,即双精度值和浮点型。考虑不精确数字的大小限制。

精确值(十进制)

A -> 1/2 有 5 位小数是 0.5000

B -> 1/2 有 10 位小数是 0.5000000000

A == B 总是 return true

不精确的值(十进制)

A -> 1/3 有 5 位小数是 0.33333

B -> 1/3 有 10 位小数是 0.3333333333

A == B -> 总是 return false 因为它们不一样。

同样,0.55 不能用二进制精确表示,但 0.5 可以。

0.55d的二进制表示 -> 0.10001100110011001101...

所以他们不会相等

0.5d的二进制表示->0.1

所以他们会相等

希望能解开你的疑惑