java BigDecimal 遇到的坑 BigDecimal 注意點事項 BigDecimal 比較大小
一、遇到問題
在使用 java.math包的 BigDecimal類進行高精確度運算時,發現在使用構造方法 new BigDecimal 和 BigDecimal.valueOf 方法創建的 BigDecimal對象,居然不相等的情況,此處容易暗生bug,且難以發現,故記錄一下。
二、代碼重現
1、new BigDecimal 和 BigDecimal.valueOf 方法創建的 BigDecimal對象
2、輸出 BigDecimal 對象
3、比較地址值
4、代碼如下:
@Test
public void test() {
double d1 = 0.1D ;
double d2 = 0.1D ;
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
System.out.println(b1);
System.out.println(b2);
System.out.println(b1 == b2);
}
5、輸出結果如下:
0.1000000000000000055511151231257827021181583404541015625
0.1
false
6、問題: b1 比 b2 多了一串浮點數 ,精度異常。
三、BigDecimal 比較大小
1、代碼如下:
@Test
public void compare() {
double d1 = 0.1D ;
double d2 = 0.1D ;
BigDecimal b1 = BigDecimal.valueOf(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
System.out.println(b1 == b2);
System.out.println(b1.equals(b2));
System.out.println(b1.compareTo(b2)); // 返回 int
}
2、輸出結果如下:
false
true
0
3、說明: b1.compareTo(b2):返回 int,
等於0,則b1=b2;
等於 1 ,則b1>b2 ;
等於-1,則b1<b2。
四、總結
1、new BigDecimal()精度異常問題,請自行查閱資料,或者看JDK源碼瞭解。
2、對於創建BigDecimal對象,請使用 BigDecimal.valueOf(xx)方法,或者 new BigDecimal(String.valueOf(xx))方法。 ---- 原因可查看源碼瞭解。
3、BigDecimal 比較可以用 compareTo 方法,或者 equals 方法都可以。 --- BigDecimal方法重寫了 equals 方法 同時也 實現了 java.lang.Comparable<BigDecimal> 接口。
4、BigDecimal 實現常見運算(加、減、乘、除)需要使用對應的方法,不能直接對象相加。 --- 請自行查閱JDK文檔。
5、BigDecimal 還可實現保留若干未小數,setScale() 方法 , 請了解一下。
6、.........更多的,自己去看看唄。