2012-04-03 36 views
32

一些有趣的觀察w.r.t等於0運營商和0.0在Java中

  1. new Double(0.0).equals(0)返回false的Equals爲零點運營商(BigDecimal的/雙人間),而new Double(0.0).equals(0.0)返回true。

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

看起來字符串比較正在兩種情況下完成。任何人都可以對此有所瞭解。

謝謝。

回答

59

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和整數new Double(0.0).equals(0),返回false,因爲對象具有不同的類型。作爲參考,code for the equals method in JDK 7是:

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

在你的情況,(obj instanceof Double)是假的。

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

作爲您傳遞的參數是整數。和equels() in Double類檢查參數是否爲od實例Double或者不使用實例運算符。

Double等於()方法。

if (!(argument instanceof Double)) 
    return false; 

你傳遞的參數是整數,這不是實例,因此它返回false。

5
  1. 在您的第一表達的0被解釋爲int,其可以被autoboxed成Integer,但不能分配給Double。所以兩者的類型是不同的,因此它們並不相同。 OTOH 0.0double,它自動裝箱到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 
    
0

新雙(0.0).equals(0)實際上是盒裝的東西是這樣的:

new Double(0.0).equals(Integer.valueOf(0)) 

Double.equals (...)永遠不會返回true,除非給出另一個Double實例。

+0

@LukasEder謝謝,更新。 – Adam 2012-04-03 11:16:02

0
new Double(0.0).equals(0) 

這條線進行比較的0雙精度值(這是不準確的零),用0

BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0)) 

整數的BigDecimal將比較在equals操作刻度長度。

0

出於性能考慮的BigDecimal,BigInteger的在BigDecimal的情況下高速緩存小值 0至15(無級分)

BigDecimal.ZERO將新的BigDecimal(BigInteger.ZERO,0,0,1) &的valueOf方法通常從緩存中從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"); 
} 
+1

將BigDecimal轉換爲double可能會導致精度損失和非零但接近於零BigDecimal轉換爲Double可能會變爲0.您應該使用BigDecimal中的compareTo方法進行比較 – 2013-10-12 18:34:29