BigDecimal的8種精度取捨方式

package cn.xbz;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XBigDecimalDemo {

    /** 默認的數據精度 , 採用比較常用的2位 */
    private static final int DEF_SCALE = 2;

    /** 正數樣本 */
    private static final List<BigDecimal> BIG_DECIMAL_STREAM = Arrays.asList(
            new BigDecimal("1.230"),
            new BigDecimal("1.231"),
            new BigDecimal("1.234"),
            new BigDecimal("1.235"),
            new BigDecimal("1.236"),
            new BigDecimal("1.239"));

    /** 負數樣本 */
    private static final List<BigDecimal> _BIG_DECIMAL_STREAM = BIG_DECIMAL_STREAM.stream().map(BigDecimal.ZERO::subtract).collect(Collectors.toList());

    public static void main(String[] args) throws Exception {
//        ROUND_CEILING();//向上進位
//        ROUND_FLOOR();//向下舍位

//        ROUND_HALF_UP();//四捨五入
//        ROUND_HALF_DOWN();//五舍六入

//        ROUND_UP();//絕對值向上進位
//        ROUND_DOWN();//絕對值向下舍位

        ROUND_HALF_EVEN();//銀行家算法 四捨六入 五看前數 奇進偶舍
//        ROUND_UNNECESSARY();//不捨位 , 精度位數小於小數位數會拋出異常
    }

    /**
     * BigDecimal.ROUND_CEILING 向上進位 .
     *      若當前精度位後一位數字不爲0 , 則向上進位
     *      數字更大
     */
    private static void ROUND_CEILING() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_CEILING >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_CEILING)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_CEILING > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_CEILING)));
    }

    /**
     * BigDecimal.ROUND_FLOOR 向下舍位 .
     *      若當前精度位後一位數字不爲0 , 則向下舍位
     *      數字更小
     */
    private static void ROUND_FLOOR() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_FLOOR >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_FLOOR)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_FLOOR > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_FLOOR)));
    }

    /**
     * BigDecimal.ROUND_HALF_UP , 4舍5入 .
     *      正數4舍5進 , 負數4舍5退(-1.234 -> -1.23 ; -1.235 -> -1.24)
     */
    public static void ROUND_HALF_UP() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_UP >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP)));
    }

    /**
     * BigDecimal.ROUND_HALF_DOWN , 5舍6入
     *      正數5舍6進 , 負數5舍6退(-1.235 -> -1.23 ; -1.236 -> -1.24)
     */
    public static void ROUND_HALF_DOWN() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_DOWN >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_DOWN)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_DOWN)));
    }

    /**
     * BigDecimal.ROUND_HALF_EVEN , 銀行家算法 . 4舍6入 , 5看前數  , 奇進偶舍
     *      正數4舍6進 , 5看前一位數字 , 若爲奇數則進位 , 若爲偶數則舍位
     *      負數5舍6退(-1.235 -> -1.23 ; -1.236 -> -1.24)
     */
    public static void ROUND_HALF_EVEN() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_EVEN >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_EVEN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
        System.out.println();
        BigDecimal bd = new BigDecimal("0.01");
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal.add(bd) + " > ROUND_HALF_EVEN >  " + bigDecimal.add(bd).setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal.add(bd) + " > ROUND_HALF_EVEN > " + bigDecimal.add(bd).setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
    }

    /**
     * BigDecimal.ROUND_UP , 絕對值向上進位 .
     *      若當前精度位後一位數字不爲0 , 則絕對值向上進位
     *      正數更大 , 負數更小
     */
    public static void ROUND_UP() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_UP >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_UP)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_UP)));
    }

    /**
     * BigDecimal.ROUND_DOWN , 絕對值向下舍位 .
     *      若當前精度位後一位數字不爲0 , 則絕對值向下舍位
     *      正數更小 , 負數更大
     */
    public static void ROUND_DOWN() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_DOWN >  " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_DOWN)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_DOWN)));
    }

    /**
     * BigDecimal.ROUND_UNNECESSARY , 不捨位 . 精度位數小於小數位數會拋出異常
     */
    public static void ROUND_UNNECESSARY() {
        BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > UNNECESSARY >  " + bigDecimal.setScale(3, BigDecimal.ROUND_UNNECESSARY)));
        System.out.println();
        _BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > UNNECESSARY > " + bigDecimal.setScale(3, BigDecimal.ROUND_UNNECESSARY)));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章