BigDecimal 在資金計算時正確使用姿勢

FeelTouch發表於2018-07-29

1. BigDecimal可以接受數字和String型別,為保證精確性應使用String型別

當我們用double型別的資料作為引數時,構造出的BigDecimal 物件value1並不能保證資料的準確性。 而用String作為引數時構造物件時,資料的準確性是有保證的。

public void constructTest(){

   BigDecimal value1 =new BigDecimal(10.511);
   System.out.println("value1: " + value1);
   BigDecimal value2 = new BigDecimal("10.511");
   System.out.println("value2: " + value2);

}

result:

value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511

2.BigDecimal 不可變性

BigDecimal 和String 一樣具有物件不可變行,一旦賦值就不會再變

BigDecimal 和String 一樣具有物件不可變行,一旦賦值就不會再變。
public void immutableTest() {

   BigDecimal count = new BigDecimal("1.3");
   count.add( new BigDecimal("9.2"));
   System.out.println("count:" + count);

}
 
count:1.3

執行程式碼會發現count不是預期的10.5,還是初始的賦值1.3 

3.計算錢有關的 bean屬性都宣告為BigDecimal

   	 BigDecimal money = new BigDecimal(455099051455.97);
       	 BigDecimal invest = new BigDecimal(444198102911.940);
   
       	 BigDecimal investMoneys =money.subtract(invest);
          	 System.out.println("老方法1:"+investMoneys.setScale(0, BigDecimal.ROUND_DOWN));
       	 System.out.println("老方法:"+investMoneys.intValue());
   老方法1:10900948544
   老方法:-1983953344

第一個算的是對的,第二個算的是錯
要取整的時候用setScale(0,BigDecimal.ROUND_DOWD)保留零位小數,後邊的都舍掉

相關文章