在 java中, 四舍五入通過 BigDecimal 來實現。一定要注意:BigDecimal is Immutable。也就是跟String一樣,對前一個的修改,比如setScale(), add()等都會返回一個新的BigDecimal.四舍五入舍入模式是 BigDecimal.ROUND_HALF_UP 其他的舍入參考下圖:
不同舍入模式下的舍入操作匯總
輸入數字 | 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 |
比如: 1/3 四舍五入保留
4位數
new BigDecimal(1).setScale(
4).divide(new BigDecimal(3),BigDecimal.ROUND_HALF_UP) // 0.333
在加減乘除中還可以有一個參數, 比如:
multiply(BigDecimal multiplicand,
MathContext mc)
MathContext 也可以設置精度和舍入規則。
MathContext m = new MathContext(1,RoundingMode.HALF_UP); //表示精度1位,舍入規則是四舍五入。
還有注意的的是:結果的精度。如下圖
Operation | Preferred Scale of Result |
Add |
max(addend.scale(), augend.scale()) |
Subtract |
max(minuend.scale(), subtrahend.scale()) |
Multiply |
multiplier.scale() + multiplicand.scale() |
Divide |
dividend.scale() - divisor.scale() |
也就是說對于除法,結果的精度是被除數減去除數的精度。