在涉及到貨幣等一些對精確度要求絲毫不差的運用場景中,我們往往會使用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呢。