BigDecimal 舍入模式(Rounding mode)介紹
BigDecimal 舍入模式(Rounding mode)介紹
1 RoundingMode介紹
package java.math;
public enum RoundingMode {
UP(BigDecimal.ROUND_UP),
DOWN(BigDecimal.ROUND_DOWN),
CEILING(BigDecimal.ROUND_CEILING),
FLOOR(BigDecimal.ROUND_FLOOR),
HALF_UP(BigDecimal.ROUND_HALF_UP),
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);
final int oldMode;
private RoundingMode(int oldMode) {
this.oldMode = oldMode;
}
public static RoundingMode valueOf(int rm) {
switch(rm) {
case BigDecimal.ROUND_UP:
return UP;
case BigDecimal.ROUND_DOWN:
return DOWN;
case BigDecimal.ROUND_CEILING:
return CEILING;
case BigDecimal.ROUND_FLOOR:
return FLOOR;
case BigDecimal.ROUND_HALF_UP:
return HALF_UP;
case BigDecimal.ROUND_HALF_DOWN:
return HALF_DOWN;
case BigDecimal.ROUND_HALF_EVEN:
return HALF_EVEN;
case BigDecimal.ROUND_UNNECESSARY:
return UNNECESSARY;
default:
throw new IllegalArgumentException("argument out of range");
}
}
}
RoundingMode是一個列舉類,有以下幾個值:UP,DOWN,CEILING,FLOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY
2 舍入模式
2.1 UP
public final static int ROUND_UP = 0;
定義:遠離零方向舍入。
解釋:始終對非零捨棄部分前面的數字加 1。注意,此舍入模式始終不會減少計算值的絕對值。
圖示:
示例:
輸入數字 | 使用 UP 舍入模式將輸入數字舍入為一位數 |
5.5 | 6 |
2.5 | 3 |
1.6 | 2 |
1.1 | 2 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -2 |
-1.6 | -2 |
-2.5 | -3 |
-5.5 | -6 |
2.2 DOWN
public final static int ROUND_DOWN = 1;
定義:向零方向舍入。
解釋:從不對捨棄部分前面的數字加 1(即截尾)。注意,此舍入模式始終不會增加計算值的絕對值。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 5 |
2.5 | 2 |
1.6 | 1 |
1.1 | 1 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -1 |
-1.6 | -1 |
-2.5 | -2 |
-5.5 | -5 |
2.3 CEILING
public final static int ROUND_CEILING = 2;
定義:向正無限大方向舍入。
解釋:如果結果為正,則舍入行為類似於 RoundingMode.UP;如果結果為負,則舍入行為類似於RoundingMode.DOWN。注意,此舍入模式始終不會減少計算值。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 6 |
2.5 | 3 |
1.6 | 2 |
1.1 | 2 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -1 |
-1.6 | -1 |
-2.5 | -2 |
-5.5 | -5 |
2.4 FLOOR
public final static int ROUND_FLOOR = 3;
定義:向負無限大方向舍入。
解釋:如果結果為正,則舍入行為類似於 RoundingMode.DOWN;如果結果為負,則舍入行為類似於RoundingMode.UP。注意,此舍入模式始終不會增加計算值。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 5 |
2.5 | 2 |
1.6 | 1 |
1.1 | 1 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -2 |
-1.6 | -2 |
-2.5 | -3 |
-5.5 | -6 |
2.5 HALF_UP (Half指的中點值,例如0.5、0.05,0.15等等)
public final static int ROUND_HALF_UP = 4;
定義:向最接近的數字方向舍入,如果與兩個相鄰數字的距離相等,則向上舍入。
解釋:如果被捨棄部分 >= 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常學校裡講的四捨五入。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 6 |
2.5 | 3 |
1.6 | 2 |
1.1 | 1 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -1 |
-1.6 | -2 |
-2.5 | -3 |
-5.5 | -6 |
2.6 HALF_DOWN
public final static int ROUND_HALF_DOWN = 5;
定義:向最接近的數字方向舍入,如果與兩個相鄰數字的距離相等,則向下舍入。
解釋:如果被捨棄部分 > 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常講的五舍六入。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 5 |
2.5 | 2 |
1.6 | 2 |
1.1 | 1 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -1 |
-1.6 | -2 |
-2.5 | -2 |
-5.5 | -5 |
2.7 HALF_EVEN
public final static int ROUND_HALF_EVEN = 6;
定義:向最接近數字方向舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
解釋:如果捨棄部分左邊的數字為奇數,則舍入行為同 RoundingMode.HALF_UP;如果為偶數,則舍入行為同RoundingMode.HALF_DOWN。注意,在重複進行一系列計算時,根據統計學,此舍入模式可以在統計上將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。此舍入模式類似於 Java 中對float 和double 演算法使用的舍入策略。
圖示:
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 6 |
2.5 | 2 |
1.6 | 2 |
1.1 | 1 |
1.0 | 1 |
-1.0 | -1 |
-1.1 | -1 |
-1.6 | -2 |
-2.5 | -2 |
-5.5 | -6 |
2.8 UNNECESSARY
public final static int ROUND_UNNECESSARY = 7;
定義:用於斷言請求的操作具有精確結果,因此不發生舍入。
解釋:計算結果是精確的,不需要舍入,否則丟擲 ArithmeticException。
示例:
輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
5.5 | 丟擲 ArithmeticException |
2.5 | 丟擲 ArithmeticException |
1.6 | 丟擲 ArithmeticException |
1.1 | 丟擲 ArithmeticException |
1.0 | 1 |
-1.0 | -1 |
-1.1 | 丟擲 ArithmeticException |
-1.6 | 丟擲 ArithmeticException |
-2.5 | 丟擲 ArithmeticException |
-5.5 | 丟擲 ArithmeticException |