天天看點

BigDecimal比較大小

BigDecimal比較大小

BigDecimal,是一種java.math包中提供的一種可以用來進行精确運算的類型,在進行金額表示、金額計算等場景,不能使用double、float等類型,而是要使用對精度支援的更好的BigDecimal。

是以,很多支付、電商、金融等業務中,BigDecimal的使用非常頻繁,其内部自帶了很多方法,如加,減,乘,除等運算方法都是可以直接調用的,代碼中還經常需要對于數字進行相等判斷。

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal == bigDecimal1);
//false      

有人會犯這種低級錯誤,用==直接比較肯定是無法得到自己想要的情況的,因為BigDecimal是對象,是以是無法用==來比較兩個數字的值是否相等。

== 可以用來比較基本類型的數值,例如:

int a = 1;
int b = 1;
System.out.println(a==b);
//true      
BigDecimal比較大小

== 用來比較對象,比較的是引用對象的引用位址,例如:

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);

System.out.println(bigDecimal == bigDecimal1);
//false      
BigDecimal比較大小

由于對象的引用位址不一樣,是以傳回false。

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal.equals(bigDecimal1));
//true


BigDecimal bigDecimal2 = new BigDecimal(1);
BigDecimal bigDecimal3 = new BigDecimal(1.0);
System.out.println(bigDecimal2.equals(bigDecimal3));
//true


BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));
//false      

通過結果可以看出BigDecimal在進行equals比較時,有的時候是true(當使用int、double定義BigDecimal時),有的時候是false(當使用String定義BigDecimal時)。

在BigDecimal的JavaDoc注釋中提到,equals和compareTo比較不太一樣,equals比較時會比較value and scale,是以再來看上面bigDecimal4和bigDecimal5的結果就明白了

BigDecimal比較大小

那麼為什麼用int 、double定義BigDecimal時就一樣呢

  • 用int時debug結果圖
    BigDecimal比較大小
    其中scale和xDec.scale的值都是0
  • 用double時debug結果圖
    BigDecimal比較大小
  • 用string時debug結果圖
    BigDecimal比較大小
    其中bigDecimal4的scale是0,而bigDecimal5的scale是1,這樣比較的結果就是false了。

前面,我們解釋了BigDecimal的equals方法,其實不隻是會比較數字的值,還會對其标度進行比較。

是以,當我們使用equals方法判斷判斷兩個數是否相等的時候,是極其嚴格的。

針對上面equals比較比較嚴格的情況,如果隻想比較值呢,BigDecimal為我們提供了compareTo方法。

BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));
//false

BigDecimal bigDecimal6 = new BigDecimal("1");
BigDecimal bigDecimal7 = new BigDecimal("1.0");
System.out.println(bigDecimal6.compareTo(bigDecimal7));
//0      

此時我們看到bigDecimal6和bigDecimal7比較的值為0,即相等。

我們可以看到BigDecimal中compareTo的JavaDoc注釋,compareTo隻比較值,其中傳回結果:-1表示小于,0表示等于,1表示大于

BigDecimal比較大小

一般BigDecimal值的比較用compareTo就好,用equals比較的話可能會得到不是你想要的結果而自己又不曾意識到。