比较0.55和0.55f时结果错误

时间:2019-07-10 09:54:16

标签: c floating-point precision floating-accuracy

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

  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
为什么会有这种差异?

2 个答案:

答案 0 :(得分:4)

0.5dyadic rational,大小合适,因此0.5恰好是floatdouble的一半。

0.55不能说相同。 double将以不小于float且最有可能更高的精度存储该数字。

在两种情况下,float都隐式转换为double之前的==,但是到那时,所有截断都发生了。

答案 1 :(得分:3)

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

精确值(十进制)

A-> 1/2(含5个小数)是0.5000

B-> 1/2(含10个小数)是0.5000000000

A == B将始终返回true

值不精确(十进制)

A-> 1/3(带5个小数)是0.33333

B-> 1/3(含10个小数)是0.3333333333

A == B->总是返回false,因为它们不相同。

类似地,不能精确地用二进制表示0.55,但是可以精确地表示0.5。

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

因此它们将不相等

0.5d-> 0.1的二进制表示形式

所以它们将相等

希望它消除了您的疑问