1. 程式人生 > 實用技巧 >Java中資料格式化類DecimalFormat中八種舍入模式(Rounding Mode)

Java中資料格式化類DecimalFormat中八種舍入模式(Rounding Mode)

Java中資料格式化類DecimalFormat中八種舍入模式(Rounding Mode)

目錄
DecimalFormat用法:

    double value = 11111110.8;
    //舍入模式
    RoundingMode roundingMode = RoundingMode.HALF_UP;
    DecimalFormat df = new DecimalFormat("###,###");
    df.setRoundingMode(roundingMode);
    String result =  df.format(value);
    System.out.println(result);

RoundingMode共有八種,分別如下:

1. UP與DOWN的區別

RoundingMode.UP: 向遠離零點方向舍入

RoundingMode.DOWN: 向零點方向舍入(截斷數字)

假設保留整數,例子如下:

UP DOWN
-1.5 -2 -1
-0.3 -1 0
0 0 0
0.3 1 0
1.5 2 1

2. CEILING和FLOOR的區別

RoundingMode.CEILING: 向正無窮方法舍入

RoundingMode.FLOOR: 向負無窮方向舍入

假設保留整數,例子如下:

CEILING FLOOR
-1.5 -1 -2
-0.3 0 -1
0 0 0
0.3 1 0
1.5 2 1

3. HALF_UP、HALF_DOWN和HALF_EVEN區別

假設要處理的那一位數字為n,

如果n大於5,則和RoundingMode.UP舍入方式一致,向遠離零點方向舍入

如果n小於5, 則和RoundingMode.DOWN舍入方式一致,向零點方向舍入。

如果n等於5,

​ RoundingMode.HALF_UP: 向遠離零點方向舍入;(通常意義上的四捨五入)

​ RoundingMode.HALF_DOWN: 向零點方向舍入;

​ RoundingMode.HALF_EVEN: 取最近兩個數中的偶數;

假設保留整數,例子如下:

HALF_UP HALF_DOWN HALF_EVEN
-1.6 -2 -2 -2
-1.5 -2 -1 -2
-0.5 -1 0 0
-0.3 0 0 0
0.3 0 0 0
0.5 1 0 0
1.5 2 1 2
1.6 2 2 2

附測試程式碼:

public class Test {
    public static void main(String[] args) throws Exception {
        RoundingMode[] modes = {RoundingMode.HALF_UP, RoundingMode.HALF_DOWN, RoundingMode.HALF_EVEN};
        double[] values = {-1.6, -1.5, -0.5, -0.3, 0.3, 0.5, 1.5, 1.6};
        test(values, modes);
    }

    private static void test(double[] values, RoundingMode[] modes) {
        for (double value : values) {
            System.out.println();
            for (RoundingMode mode : modes) {
                System.out.print(fix(value, mode) + " ");
            }
        }
    }

    private static String fix(double value, RoundingMode mode) {
        DecimalFormat df = new DecimalFormat("###,###");
        df.setRoundingMode(mode);
        return df.format(value);
    }
}

4. UNNECESSARY作用

RoundingMode.UNNECESSARY: 只有當要處理的那一位數字為零時不丟擲異常,並進行處理, 其他情況都會丟擲異常。
假設保留整數,例子如下:

UNNECESSARY
-1.2 throw ArithmeticException
-1.0 -1
0 0
1.0 1
1.2 throw ArithmeticException

測試程式碼如下:

import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Test {
    public static void main(String[] args) throws Exception {
        RoundingMode[] modes = {RoundingMode.HALF_UP, RoundingMode.HALF_DOWN, RoundingMode.HALF_EVEN};
        double[] values = {-1.6, -1.5, -0.5, -0.3, 0.3, 0.5, 1.5, 1.6};
        test(values, modes);
    }

    private static void test(double[] values, RoundingMode[] modes) {
        for (double value : values) {
            System.out.println();
            for (RoundingMode mode : modes) {
                System.out.print(fix(value, mode) + " ");
            }
        }
    }

    private static String fix(double value, RoundingMode mode) {
        DecimalFormat df = new DecimalFormat("###,###");
        df.setRoundingMode(mode);
        return df.format(value);
    }
}