今天又踩了一個坑,使用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.15 傳回的是1.1
-
傳入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