setScale(1)表示保留一位小數,默認用四捨五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3
setScale(1,BigDecimal.ROUND_UP)進位處理,2.31變成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4java
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,若是是5則向下舍ide
註釋:spa
1:scale指的是小數點後的位數。好比123.456則scale就是3.
scale()就是BigDecimal類中的方法。
好比:BigDecimal b = new BigDecimal("123.456");對象
b.scale(),返回的就是3.ip
2:
roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,有不少種。
好比:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的,你能夠本身選!ci
4:對於通常add、subtract、multiply方法的小數位格式化以下:數學
BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);it
----結果:----- mData=9.66io
java.math.BigDecimaltable
不可變的、任意精度的有符號十進制數。BigDecimal 由任意精度的整數非標度值和32位的整數標度(scale)組成。
若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以10的負scale次冪。
所以,BigDecimal表示的數值是(unscaledValue × 10-scale)。
與之相關的還有兩個類:
java.math.MathContext:
該對象是封裝上下文設置的不可變對象,它描述數字運算符的某些規則,如數據的精度,舍入方式等。
java.math.RoundingMode:
這是一種枚舉類型,定義了不少經常使用的數據舍入方式。
這個類用起來仍是很比較複雜的,緣由在於舍入模式,數據運算規則太多太多,
不是數學專業出身的人看着中文API都難以理解,這些規則在實際中使用的時候在翻閱都來得及。
在銀行、賬戶、計費等領域,BigDecimal提供了精確的數值計算。其中8種舍入方式值得掌握。
一、ROUND_UP
舍入遠離零的舍入模式。
在丟棄非零部分以前始終增長數字(始終對非零捨棄部分前面的數字加1)。
注意,此舍入模式始終不會減小計算值的大小。
二、ROUND_DOWN
接近零的舍入模式。
在丟棄某部分以前始終不增長數字(從不對捨棄部分前面的數字加1,即截短)。
注意,此舍入模式始終不會增長計算值的大小。
三、ROUND_CEILING
接近正無窮大的舍入模式。
若是 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;
若是爲負,則舍入行爲與 ROUND_DOWN 相同。
注意,此舍入模式始終不會減小計算值。
四、ROUND_FLOOR
接近負無窮大的舍入模式。
若是 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;
若是爲負,則舍入行爲與 ROUND_UP 相同。
注意,此舍入模式始終不會增長計算值。
五、ROUND_HALF_UP
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。
若是捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同。
注意,這是咱們大多數人在小學時就學過的舍入模式(四捨五入)。
六、ROUND_HALF_DOWN
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。
若是捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同(五舍六入)。
七、ROUND_HALF_EVEN
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
若是捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;
若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。
注意,在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。
此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況。
若是前一位爲奇數,則入位,不然捨去。
如下例子爲保留小數點1位,那麼這種舍入方式下的結果。
1.15>1.2 1.25>1.2
八、ROUND_UNNECESSARY
斷言請求的操做具備精確的結果,所以不須要舍入。
若是對得到精確結果的操做指定此舍入模式,則拋出ArithmeticException。
根據給定的舍入模式將輸入數字舍入爲一位數的結果 | ||||||||
---|---|---|---|---|---|---|---|---|
輸入數字 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN | UNNECESSARY |
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | 拋出 ArithmeticException |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 | 拋出 ArithmeticException |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 | 拋出 ArithmeticException |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 | 拋出 ArithmeticException |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1.0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 | 拋出 ArithmeticException |
-1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 | 拋出 ArithmeticException |
-2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 | 拋出 ArithmeticException |
-5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 | 拋出 ArithmeticException |
運行結果爲: