Java中等于零(BigDecimal / Double)的运算符


问题内容

一些有趣的发现wrt等于0和0.0上的运算符

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

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

看起来在两种情况下都完成了字符串比较。谁能对此有所启发。

谢谢。


问题答案:

BigDecimal“等于”比较值和小数位数。如果只想比较值(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进行比较new Double(0.0).equals(0),这false是因为对象具有不同的类型而返回。作为参考,JDK
7中equals方法
代码为

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

就您而言,(obj instanceof Double)是错误的。