[英]Equals operator for zeros (BigDecimal / Double) in Java
一些有趣的觀察wrt等於0和0.0上的運算符
new Double(0.0).equals(0)
返回false,而new Double(0.0).equals(0.0)
返回true。
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)
是錯誤的。
第一個表達式中的0被解釋為int
,可以自動裝箱為Integer
,但不能自動裝入Double
。 所以兩者的類型不同,因此它們不相等。 OTOH 0.0
是一個double
,它被自動裝箱成一個Double
,因此兩個操作數被視為相等。
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實例雙人或不使用操作者的實例 。
Double的equals()方法。
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.