Java浮點數運算實現四捨五入和格式化方法總結

FeelTouch發表於2018-07-05

method 1

/**
         * method 1 值舍入時推薦
         */
        String srcBlance = "82.54466";
        double rate = 0.01;
        double f = Double.parseDouble(srcBlance);
        //BigDecimal b = new  BigDecimal(f * rate); /** 會有精確性問題*/
        BigDecimal b = new  BigDecimal(new Double(f * rate).toString()); /** 不會有精確性問題*/
        double f1  =  b.setScale(0, RoundingMode.HALF_UP).doubleValue();
        long extBalance = NumUtils.roundToLong(String.valueOf(f1)); /** roundToLong具備自動將浮點數進行整數化功能*/
        System.out.println(extBalance);

method 2

/**
         * method 2 值舍入時推薦
         */
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.UP);
        System.out.println("method2: "+ nf.format(f));

method 3

/**
         * method 3 僅僅格式化 保證精確
         */
        DecimalFormat df = new DecimalFormat("#.000");
        System.out.println("method3:" + df.format(f));

method 4

/**
         * method 4 僅僅格式化 保證精確
         */
        System.out.println(String.format("%.2f", f));

RoundingMode

目前java支援7中舍入法:
         1、 ROUND_UP:遠離零方向舍入。向絕對值最大的方向舍入,只要捨棄位非0即進位。
         2、 ROUND_DOWN:趨向零方向舍入。向絕對值最小的方向輸入,所有的位都要捨棄,不存在進位情況。
         3、 ROUND_CEILING:向正無窮方向舍入。向正最大方向靠攏。若是正數,舍入行為類似於ROUND_UP,若為負數,舍入行為類似於ROUND_DOWN。Math.round()方法就是使用的此模式。
         4、 ROUND_FLOOR:向負無窮方向舍入。向負無窮方向靠攏。若是正數,舍入行為類似於ROUND_DOWN;若為負數,舍入行為類似於ROUND_UP。
         5、 HALF_UP:最近數字舍入(5進)。這是我們最經典的四捨五入。
         6、 HALF_DOWN:最近數字舍入(5舍)。在這裡5是要捨棄的。
         7、 HAIL_EVEN:銀行家舍入法。

相關文章