Double精度丟失解決方案《淺談BigDecimal》

  • 爲何金額要使用BigDecimal而不使用Double?

在電商或者金融行業,看似很小的偏差可是經過一番計算後會致使很大的偏差,偏差將演變爲錯誤。錯誤將致使不能漲薪。
BigDecimal 類提供如下操做:算術、標度操做、舍入、比較、哈希算法和格式轉換java

1. double精度丟失示例
例1:
 Double d1 = 1.0000001;
 Double d2 = 0.000002;
 //理想輸出1.0000021,實際輸出1.0000021000000001
 System.out.println(d1+d2);
 //實際輸出1.0000021  理想輸出1.0000021
 System.out.println(new BigDecimal(d1.toString()).add(new     BigDecimal(d2.toString())));
 例2:
 Double d3 = 11540d;
 Double d4 = 0.35;
 //實際輸出4038.9999999999995 理想輸出4039
 System.out.println(d3*d4);
 //實際輸出4039.000 理想輸出4039
 System.out.println(new BigDecimal(d3.toString()).multiply(new BigDecimal(d4.toString())));
2. BigDecimal的基本使用
BigDecimal decimal =  new BigDecimal("1.3");
BigDecimal decimal1 =  new BigDecimal("3.32");
//加
System.out.println(decimal.add(decimal1));
//減
System.out.println(decimal1.subtract(decimal));
//乘
System.out.println(decimal1.multiply(decimal));
//除
System.out.println(decimal1.divide(decimal,2,BigDecimal.ROUND_CEILING ));
3. BigDecimal精度處理類型

BigDecimal 類使用戶能徹底控制舍入行爲。若是未指定舍入模式,而且沒法表示準確結果,則拋出一個異常;不然,經過向該操做提供適當的 MathContext 對象,能夠對已選擇的精度和舍入模式執行計算。在任何狀況下,能夠爲舍入控制提供八種舍入模式。使用此類(例如,ROUND_HALF_UP)中的整數字段來表示舍入模式已過期;應改成使用 RoundingMode enum(例如,RoundingMode.HALF_UP)的枚舉值。
八種舍入模式:算法

CEILING 向正無限大方向舍入的舍入模式。 
  DOWN 向零方向舍入的舍入模式。 
  FLOOR 向負無限大方向舍入的舍入模式。 
  HALF_DOWN  向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向下舍入。 
  HALF_EVEN 向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。 
  HALF_UP  向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向上舍入 
  UNNECESSARY 用於斷言請求的操做具備精確結果的舍入模式,所以不須要舍入。 
  UP 遠離零方向舍入的舍入模式。
相關文章
相關標籤/搜索