1. 程式人生 > >BigDecimal 舍入模式(Rounding mode)介紹

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