簡體   English   中英

在Java中等於運算符為零(BigDecimal / Double)

[英]Equals operator for zeros (BigDecimal / Double) in Java

一些有趣的觀察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'equals'比較值和比例。 如果您只想比較值(0 == 0.0),您應該使用compareTo:

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

請參閱javadoc

至於Double比較,正如其他答案所解釋的那樣,你在new Double(0.0).equals(0) Double與Integer進行比較,由於對象具有不同的類型,因此返回false 作為參考, JDK 7中equals方法代碼是:

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

在您的情況下, (obj instanceof Double)是錯誤的。

  1. 第一個表達式中的0被解釋為int ,可以自動裝箱為Integer ,但不能自動裝入Double 所以兩者的類型不同,因此它們不相等。 OTOH 0.0是一個double ,它被自動裝箱成一個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 
new Double(0.0).equals(0); //false

因為你傳遞的參數是整數。 equels()類檢查是否該參數OD實例雙人或不使用操作者的實例

Doubleequals()方法。

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

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

new Double(0.0).equals(0)實際上是這樣的:

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

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

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");
} 
new Double(0.0).equals(0)

此行將double值0(不是精確的零)與0的整數進行比較。

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

BigDecimal將比較equals操作中的比例長度。

出於性能考慮,BigDecimal,BigInteger在BigDecimal(沒有分數)的情況下緩存0到15的小值

BigDecimal.ZERO將是新的BigDecimal(BigInteger.ZERO,0,0,1)和valueOf方法通常從緩存中獲取0到15 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM