一、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 }