当前位置: 首页 > 知识库问答 >
问题:

比较0.55和0.55f时结果错误

司马同
2023-03-14

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

>

  • 比较0.55

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

    输出Hello

    比较0.5

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

    输出Hi

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

  • 共有2个答案

    何玉韵
    2023-03-14

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

    A-

    B-

    A==B将始终返回true

    A-

    B-

    A==B-

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

    0.55d的二进制表示-

    所以他们不会平等

    0.5d的二进制表示-

    所以他们是平等的

    希望它能消除你的疑虑

    子车宏浚
    2023-03-14

    0.5是一个二进有理数,并且具有适当的幅度,因此0.5正好是浮点数的二分之一。

    对于0.55,情况并非如此。double将以不低于float的精度存储该数字,很可能更高。

    在这两种情况下,在=之前,浮点数都隐式地转换为,但此时已发生任何截断。

     类似资料:
    • 问题内容: 当我比较具有相同下划线字符串的两个StringBuilder对象时,即使value应该为true也会返回。 问题答案: 这是因为不会覆盖类中的方法。 您将必须将两个对象都转换为,然后进行比较 这将为您提供正确的结果。显然,您必须注意 null 检查等。 根据合同,如果覆盖equals,则也必须覆盖它们,但是由于可变,因此其值的任何更改都会影响对象的哈希码。如果用作键,可能会导致存储的值

    • 我正在尝试使用Java8按姓名和年龄对员工列表进行排序,我在下面创建了,但它给我一个编译器错误

    • 问题内容: 如果我输入的任何值都小于24,它会打印“ You will be old …”语句。如果我输入的任何值都大于24(最大为99),它将打印“ you old”语句。 问题是,如果您输入100或更大的值,它会显示“您将在知道之前变老”。声明。 问题答案: 您正在针对另一个字符串值(而不是整数值)测试一个字符串值。 应该 在Python中,您可以对字符串使用大于/小于符号,但是您怎么想都行不

    • 我在试着比较时间和瞬间。这是我的剧本 这是我的表格 从< code > console . log(today . format(" hh:mm "))我得到这个结果< code>01:44。 在上面的脚本中,我总是转到<code>或<code>,因此有任何方法可以修复它吗? 这是我的小提琴 https://jsfiddle.net/s9wfh9ye/33/ 我的更新问题

    • 问题内容: 同时执行: 我目前正在学习do-while vs while,并且想用while重写上面的java片段(已经声明和初始化)。以下重写的代码是否正确: 而: 干杯 问题答案: 之间的区别和是 当 比较完成。使用,您将在最后进行比较,因此至少要进行一次迭代。 您的示例的等效代码 等效于: 一般理解 甲环是一个 出口控制的循环 ,这意味着它离开末。甲环是一个 条目控制的循环 ,这意味着该条件

    • 问题内容: A = 314 结果: 我知道在if语句中使用两个“ =”和“ is”是不正常的。但是我想知道Python解释器如何解释该语句。 表达式是同时解释还是短路解释? 问题答案: 您遇到的事情称为 运算符链接 。 从比较文档: 可以任意链接比较,例如 与等效,不同之处在于比较仅被评估一次(但是在两种情况下,如果发现错误,则根本不评估)。 强调我的。 因此,这意味着将被解释为,仅此而已。 更一