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

Man*_*ani 35 java precision double bigdecimal zero

一些有趣的观察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.

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

谢谢.

ass*_*ias 66

BigDecimal'equals'比较值和比例.如果您只想比较值(0 == 0.0),您应该使用compareTo:

BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true
Run Code Online (Sandbox Code Playgroud)

请参阅javadoc.

对于Double比较,正如其他答案所解释的那样,您将Double与Integer in进行比较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));
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,(obj instanceof Double)是假的.


Pét*_*rök 5

  1. 第一个表达式中的0被解释为a int,可以自动装入a Integer,但不能自动装入a Double.所以两者的类型不同,因此它们不相等.OTOH 0.0是一个double自动装入a的Double,因此两个操作数被视为相等.

  2. BigDecimals还包含一个比例(即小数点分隔点右侧的位数).BigDecimal.ZERO值为"0",因此其比例为0.因此它不等于"0.0",其比例为1.
    如果要比较值,请使用BigDecimal.compareTo:

    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
    
    Run Code Online (Sandbox Code Playgroud)