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

关系运算符以何种方式不遵守与浮点值的比较契约?

岳昊空
2023-03-14

引用自约书亚·布洛赫的《有效Java——第二版》

对于浮点字段,请使用Double。比较或浮动。compare代替关系运算符,关系运算符在应用于浮点值时不遵守compareTo的一般约定。

它没有详细说明为什么会这样。

所以,我的问题是:

当与浮点值一起使用时,关系运算符在哪些方面不遵守比较的一般约定?

共有3个答案

岑光熙
2023-03-14

根据[Joshua_Bloch]有效的Java,第三版

本书之前的版本(第二版)建议compareTo方法使用关系运算符比较整型基本字段

在comareTo方法的实现中比较字段值时,避免使用

柳镜
2023-03-14

从JavaDoc forDouble::compareTo

在数值上比较两个双对象。此方法执行的比较有两种不同于Java语言数值比较运算符执行的比较(

>

此方法认为0.0d大于-0.0d。

这就确保了这一点。compareTo(对象)(将其行为转发给此方法)遵守Comparable的总合同。与之相比,双打的自然顺序与等号是一致的。

    double d1 =Double.NaN;
    double d2 = Double.NaN;

    System.out.println(Double.valueOf(d1).equals(d2));    ---> true
    System.out.println(Double.valueOf(d1).compareTo(d2));  ---> 0
    System.out.println(d1 == d2);                          --->false
子车征
2023-03-14

从javadoc:

 public int compareTo(Double anotherDouble)

在数值上比较两个双对象。此方法执行的比较有两种不同于Java语言数值比较运算符执行的比较(

 类似资料:
  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。

  • 问题内容: 稍微打错一下就遇到了这个问题(在Python 2.7.5中): 当它,我不小心爆炸了月亮。 我的理解是相当于和表现良好的类(如内置函数),相当于。 如果没有或运算符,那么我认为Python使用。 但是,这些方法都与工作对象,而与运营商 做 的工作。发生这种情况的原因是什么? 问题答案: 但是,当<和>运算符起作用时,这些方法都不能与函数对象一起起作用。发生这种情况的原因是什么? 在任何

  • 概述 比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。 2 > 1 // true 上面代码比较2是否大于1,返回true。 注意,比较运算符可以比较各种类型的值,不仅仅是数值。 JavaScript 一共提供了8个比较运算符。 > 大于运算符 < 小于运算符 <= 小于或等于运算符 >= 大于或等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符

  • 在C中,如果我们执行以下代码: 上面的代码打印“更少”。 但如果我们执行以下代码: 它打印“否”。 原因是什么?浮点数据类型是如何工作的?

  • 我知道使用是因为分辨率无关的坐标系。 与,,,,比较时不是容易出现误报吗?它是一个浮点,它们有不精确的问题:例如。 在比较时是否在内部处理这个问题,或者是否会发生读取为零的与不比较为true的情况?