java中的四舍五入問題。
在 java中, 四舍五入通過 BigDecimal 來實現。一定要注意:BigDecimal is Immutable。也就是跟String一樣,對前一個的修改,比如setScale(), add()等都會返回一個新的BigDecimal.四舍五入舍入模式是 BigDecimal.ROUND_HALF_UP 其他的舍入參考下圖:
比如: 1/3 四舍五入保留4位數
new BigDecimal(1).setScale(4).divide(new BigDecimal(3),BigDecimal.ROUND_HALF_UP) // 0.333
在加減乘除中還可以有一個參數, 比如:
MathContext m = new MathContext(1,RoundingMode.HALF_UP); //表示精度1位,舍入規則是四舍五入。
還有注意的的是:結果的精度。如下圖
也就是說對于除法,結果的精度是被除數減去除數的精度。
輸入數字 | 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 |
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() |
posted on 2007-04-09 17:07 advincenting 閱讀(2357) 評論(0) 編輯 收藏