在 Java 中等于零(大十进制/双精度)的运算符

2022-09-01 01:58:08

一些有趣的观察结果 w.r.t 等于 0 和 0.0 上的运算符

  1. new Double(0.0).equals(0)返回 false,而返回 true。new Double(0.0).equals(0.0)

  2. BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))返回 false,而返回 true。BigDecimal.ZERO.equals(BigDecimal.valueOf(0))

看起来在这两种情况下都进行了字符串比较。任何人都可以对此有所了解。

谢谢。


答案 1

BigDecimal “equals” 比较值和刻度。如果只想比较值 (0 == 0.0),则应使用 compareTo:

BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true

请参阅 javadoc

至于 Double 比较,正如其他答案所解释的那样,您正在将 Double 与 Integer in 进行比较,该比较是由于对象具有不同的类型而返回的。作为参考,JDK 7 中 equals 方法的代码为:new Double(0.0).equals(0)false

public boolean equals(Object obj) {
    return (obj instanceof Double)
           && (doubleToLongBits(((Double)obj).value) ==
                  doubleToLongBits(value));
}

在你的情况下,是错误的。(obj instanceof Double)


答案 2
  1. 第一个表达式中的 0 被解释为 ,可以自动装箱到 一个 中,但不能自动装箱到 .因此,两者的类型不同,因此它们不相等。OTOH 是 a,它被自动装箱成 a,所以两个操作数被认为是相等的。intIntegerDouble0.0doubleDouble

  2. 大数位数还包含一个刻度(即小数分隔点右侧的位数)。 具有“0”的值,因此其比例为 0。因此,它不等于“0.0”,其比例为1。
    如果要比较值,请使用 BigDecimal.compareToBigDecimal.ZERO

    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
    

推荐