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

问题描述 投票:0回答:7

关于 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。

看起来这两种情况都进行了字符串比较。谁能解释一下这一点。

谢谢。

java double precision bigdecimal zero
7个回答
71
投票

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 与

new Double(0.0).equals(0)
中的 Integer 进行比较,它会返回
false
,因为对象具有不同的类型。作为参考,JDK 7 中 equals 方法的代码是: public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }

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



7
投票
第一个表达式中的 0 被解释为
    int
  1. ,它可能会自动装箱为

    Integer

    ,但不会自动装箱为 
    Double
    。所以两者的类型不同,因此它们不相等。 OTOH 
    0.0
     是一个 
    double
    ,它会自动装箱为 
    Double
    ,因此两个操作数被视为相等。

    BigDecimals 还包含一个标度(即小数点分隔符右侧的位数)。
  2. BigDecimal.ZERO
  3. 的值为“0”,因此其标度为 0。因此它不等于“0.0”,其标度为 1。

    如果要比较值,请使用

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

        
new Double(0.0).equals(0) 实际上装箱如下:

1
投票
new Double(0.0).equals(Integer.valueOf(0))

Double.equals(...) 永远不会返回 true,除非给出另一个 Double 实例。
    

new Double(0.0).equals(0); //false

1
投票
因为您传递的参数是整数。
Double
类中的

equels()检查参数是否为od实例Double或不使用instance of运算符。 Double

equals()

方法。 if (!(argument instanceof Double)) return false; 您传递的参数是

integer
,它不是 
Double

的实例,因此它返回 false。 new Double(0.0).equals(0)


0
投票
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))

BigDecimal 将在 equals 运算中比较刻度长度。


出于性能考虑BigDecimal、BigInteger缓存小值 如果是 BigDecimal,则为 0 到 15(无分数)


0
投票

please try doublevalue instead of compareto if you feel is not as beautiful and readable as or simply need an alternative like below: BigDecimal a = new BigDecimal("0.00"); BigDecimal b = new BigDecimal("0.0"); BigDecimal c = new BigDecimal("0"); if(a.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("a equals"); } if(b.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("b equals"); } if(c.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("c equals"); }


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.