Java 中處理浮點數精度與格式化輸出是高頻需求,本文總結四種主流方案,對比適用場景與精度陷阱,助你選擇最佳實踐。
double f = 3.1516;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 結果:3.15
new DecimalFormat("#.00").format(3.1415926); // "3.14"
new DecimalFormat("#.0000").format(3.1415926); // "3.1416"
#.00 兩位、#.0000 四位)double d = 3.1415926;
String result = String.format("%.2f", d); // "3.14"
// %.2f 含義:% 佔位符、.2 保留兩位小數、f 浮點型
Math.round(5.2644555 * 100) * 0.01d; // 5.26
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 金融計算、精度敏感業務 | BigDecimal | 可控捨入模式,無二進制誤差 |
| 前端展示、報表導出 | DecimalFormat / String.format | 直接得字符串,模板靈活 |
| 簡單臨時計算、非關鍵路徑 | String.format | 代碼最少,可讀性好 |
| 高性能、大批量數值處理 | BigDecimal + 快取/對象池 | 避免頻繁創建對象開銷 |
new BigDecimal(double) 會攜帶 double 的二進制誤差,建議用 new BigDecimal(String) 或 BigDecimal.valueOf(double)。