天天看點

DecimalFormat 四舍五入Float類型的坑

今天又踩了一個坑,使用DecimalFormat來完成四舍五入,但是傳入的是float類型,幾輪測試才發現一個問題,傳入的float會被轉為double類型,大家都知道float是4位,double是8位,強轉肯定會造成進度丢失。

使用下面的方法

public static String formatMoney(float value) {
    DecimalFormat format = new    DecimalFormat("####.#");
        format.setRoundingMode(RoundingMode.HALF_UP);
        return "¥" + format.format(value);
    }
           
  1. 傳入1.15 傳回的是1.1
  2. 傳入1.25 傳回的是1.3

    好奇怪哦,format.format(value)預設是接收double類型,我現在傳入了float類型,也沒有報錯,但是它已經強轉為了double類型,1.15已經轉為1.149999999….精度已經丢失。

解決方案使用BigDecimal 來不丢進度的将float轉換位double

修改方法

public static float formatFloat(float value) {
        BigDecimal decimal = new BigDecimal(String.valueOf(value));
        DecimalFormat format = new DecimalFormat("####.#");
        format.setRoundingMode(RoundingMode.HALF_UP);
        return Float.parseFloat(format.format(decimal.doubleValue()));
    }
           

使用format.setRoundingMode(RoundingMode.HALF_UP);可以控制轉換的方式,具體文檔可以參考java doc

繼續閱讀