創建BigDecimal精度丟失問題

在涉及到貨幣等一些對精確度要求絲毫不差的運用場景中,我們往往會使用BigDecimal數據類型,在此以jdk 8爲例。分別按浮點數、字符串方式創建BigDecimal,觀察兩者的差別,以明確使用方式。
示例代碼如下:

		BigDecimal d1=new BigDecimal(2.0);
		BigDecimal d2=new BigDecimal(1.1);
		System.out.println(d1.subtract(d2));
		
		//this pattern used by bank system
		BigDecimal d3=new BigDecimal("2.0");
		BigDecimal d4=new BigDecimal("1.1");
		System.out.println(d3.subtract(d4));

觀察兩次構造中的傳入參數數據類型。
結果很容易就知道了,第一個輸出中因爲傳入的是浮點數類型,而在計算機中的數據採用了二進制方式保存,這種方式無法保證數據的精準性,故而產生了精度丟失的情況。
輸出結果如下:

0.899999999999999911182158029987476766109466552734375
0.9

來看看兩者之間的構造函數:

public BigDecimal(double val) {
        this(val,MathContext.UNLIMITED);
    }

public BigDecimal(String val) {
        this(val.toCharArray(), 0, val.length());
    }

綜上,想要達到精準精度的目標還是得采用字符串形式構造BigDecimal呢。

發佈了132 篇原創文章 · 獲贊 40 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章