java BigDecimal 遇到的坑 BigDecimal 注意點事項 BigDecimal 比較大小

  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、.........更多的,自己去看看唄。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章