Java中BigDecimal的equals與compareTo的區別


      有個是否為零的判斷【BigDecimal.ZERO.equals(ratio)】我用了BigDecimal的equals方法,結果,判斷失敗,因此特地分析一下equals與compareTo的區別。本文參考JAVA_VERSION="1.7.0"。 首先看一下BigDecimal的equals方法源碼:
public int compareTo(BigDecimal val) { // Quick path for equal scale and non-inflated case.
        if (scale == val.scale) { long xs = intCompact; long ys = val.intCompact; if (xs != INFLATED && ys != INFLATED) return xs != ys ? ((xs > ys) ? 1 : -1) : 0; } int xsign = this.signum(); int ysign = val.signum(); if (xsign != ysign) return (xsign > ysign) ? 1 : -1; if (xsign == 0) return 0; int cmp = compareMagnitude(val); return (xsign > 0) ? cmp : -cmp; }
 
      可以看到BigDecimal的equals方法是先判斷數據類型,在數據類型一致的前提下再判斷精確度(scale)和值(BigInteger的equals方法)是否一致。
      其實javadoc里面就已經寫的很明白:“Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).”只是自己沒有去注意罷了!再看一下compareTo方法源碼:
public int compareTo(BigDecimal val) { // Quick path for equal scale and non-inflated case.
        if (scale == val.scale) { long xs = intCompact; long ys = val.intCompact; if (xs != INFLATED && ys != INFLATED) return xs != ys ? ((xs > ys) ? 1 : -1) : 0; } int xsign = this.signum(); int ysign = val.signum(); if (xsign != ysign) return (xsign > ysign) ? 1 : -1; if (xsign == 0) return 0; int cmp = compareMagnitude(val); return (xsign > 0) ? cmp : -cmp; } 
      可以看到這個方法里面有個compareMagnitude的處理,把val轉換為int,然后再進行比較,這里省略compareMagnitude的實現。
      signum()方法,返回該數值的正負號,正數,0,負數分別對應返回結果:1,0,-1; 舉個栗子:
BigDecimal ratio = new BigDecimal("0.00"); if (0 == BigDecimal.ZERO.compareTo(ratio)) { System.out.println("二者相等"); } if (!BigDecimal.ZERO.equals(ratio)) { System.out.println(" 居然不相等 "); }  
結論:對於BigDecimal的大小比較,equals方法不僅比較值的大小,還比較兩個對象的精確度,而compareTo方法則不比較精確度,只比較數值的大小。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM