一、BigDecimal
1.簡介
float和double類型的主要涉及目標是爲了科學計算和工程計算。然而,他們沒有提供完全精確的結果,所以不應該被用於要求精確結果的場合。但是商業計算往往要求結果精確,這時候BigDecimal就派上大用場了。
BigDecimal由任意精度的整數非標度值和32位的整數標度(scale)組成。如果爲零或正數,則標度是小數點後的位數;如果爲負數,則將該數的非標度值乘以10的負scale次冪,因此,BigDecimal表示的值是unscaledValue X 10-scale
2.用法
1)構造函數和加法運算
BigDecimal bd1 = new BigDecimal(12.2);
BigDecimal bd2 = new BigDecimal("12.2");
System.out.println(bd1);
System.out.println(bd2);
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3+"---"+bd1);
輸出結果:
12.199999999999999289457264239899814128875732421875
12.2
24.399999999999999289457264239899814128875732421875---12.199999999999999289457264239899814128875732421875
2)用來格式化小數點
BigDecimal bd1 = new BigDecimal(12.23);
double value1 = bd1.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
double value2 = bd1.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
double value3 = bd1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
double value4 = bd1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
System.out.println(value4);
輸出結果:
12.0
12.2
12.23
12.23
即最少小數點後都有一位,最多不超過小數點後總位數。
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4
3.總結
1)商業計算使用BigDecimal;
2)儘量使用參數類型爲String的構造函數;
3)如String一樣,每運算一次產生一個新的對象。