在 Java 開發中,處理浮點數精度並四捨五入保留指定小數位是常見需求。本文整理了四種主流實現方式,涵蓋 BigDecimal、DecimalFormat、String.format 以及 Math.round,並說明各自適用場景與注意事項。
BigDecimal 提供精確的小數運算,避免浮點數誤差,適合金融、會計等對精度要求極高的場景。
double f = 3.1516;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 結果:3.15
關鍵點:
BigDecimal(String) 構造器或 BigDecimal.valueOf(double) 避免二進制浮點數轉換誤差。setScale(scale, roundingMode) 中 ROUND_HALF_UP 表示四捨五入,其他模式如 ROUND_DOWN(截斷)、ROUND_UP(進一)可按需選擇。適用於直接將數字格式化為特定模式的字串,如報表顯示、日誌記錄。
String result = new java.text.DecimalFormat("#.00").format(3.1415926);
// 結果:"3.14"
// #.00 代表保留兩位小數,#.0000 代表四位,以此類推
注意: 返回值為 String,若需繼續運算需再轉回數值型別。
利用格式化佔位符 %.nf(n 為小數位數),語法直觀,常用於快速輸出或日誌。
double d = 3.1415926;
String result = String.format("%.2f", d);
// 結果:"3.14"
// %.2f 中:% 表示格式化,.2 表示小數點後兩位,f 表示浮點數
透過乘以 10 的 n 次方、四捨五入、再除以相應倍數,實現保留 n 位小數。但因浮點數精度問題,可能產生如 3.1499999999 這類結果,不建議用於精度敏感場景。
double val = 5.2644555;
double rounded = Math.round(val * 100) * 0.01d;
// 結果:5.26(但可能出現 5.260000000000001)
| 方法 | 返回型別 | 精度 | 適用場景 |
|---|---|---|---|
| BigDecimal | double / BigDecimal | 高(精確) | 金融計算、精密科學計算 |
| DecimalFormat | String | 高 | 報表顯示、字串輸出 |
| String.format | String | 高 | 快速格式化、日誌輸出 |
| Math.round | double | 低(有誤差) | 非關鍵業務、簡單演示 |
實務上,涉及金額、利率等精度敏感業務務必使用 BigDecimal;單純顯示用途則可選 DecimalFormat 或 String.format 以簡化代碼。