1. 程式人生 > 實用技巧 >Java DecimalFormat四捨五入的坑及正確用法

Java DecimalFormat四捨五入的坑及正確用法

一、DecimalFormat四捨五入的坑

  1.1 有時候我們在處理小數保留幾位小數時,想到了DecimalFormat這個類的使用,百度搜一把可能用到以下方式。

 1     public static void main(String[] args) {
 2         String str="3.145";
 3         System.out.println(round1(str));
 4     }
 5 
 6     static String round1(String str){
 7         double a=Double.parseDouble(str);
 8         DecimalFormat df=new DecimalFormat("###.00");
 9         return df.format(a);
10     }

  1.2初看好像沒什麼問題,四捨五入保留兩位小數,最後輸出3.15。當然精度要求不高,也無需計較。當涉及到精確統計時,這裡的坑來了將上面的字串改為“5”前面為奇數,如“3.155”,就瓜了,輸出3.15。顯然這裡沒滿足要求,不是我們學校裡的四捨五入。再上一段程式碼。

1     static String round2(String str){
2          double a=Double.parseDouble(str);
3          DecimalFormat df=new DecimalFormat("###.00");
4          df.setRoundingMode(RoundingMode.HALF_UP);
5          return df.format(a);
6     }

  這裡可以看到這個setRoundingMode()方法可以設定四捨五入的模式,原來四捨五入不光有我們學校裡學的那種,還有其他模式。DecimalFormat預設情況下,它使用 RoundingMode.HALF_EVEN,此舍入模式也稱為“銀行家舍入法”,主要在美國使用。RoundingMode.HALF_UP這個模式才是我們學校裡學的標準四捨五入模式。以上程式碼雖然舍了學校型模式仍然不準確,應該將double型別改為BigDecimal型別。

二、學校型四捨五入幾種正確使用

  2.1 String直接格式化

1     static String round3(String str){
2          double d=Double.parseDouble(str);
3          return String.format("%.2f",d);
4     }

  2.2 BigDecimal結合DecimalFormat,BigDecimal比較好效能,資料處理量大不建議使用。

1     static String round4(String str){
2          BigDecimal bigDecimal=new BigDecimal(str);
3          DecimalFormat df=new DecimalFormat("###.00");
4          df.setRoundingMode(RoundingMode.HALF_UP);
5          return df.format(bigDecimal);
6     }

  2.3 BigDecimal單獨使用,這個類也自帶舍入模式設定方法。

1     static String round5(String str){
2          BigDecimal bigDecimal=new BigDecimal(str);
3          return String.valueOf(bigDecimal.setScale(2,RoundingMode.HALF_UP));
4     }