金融、計量等場景需精確控制小數位。使用 BigDecimal 避免浮點誤差,輔以 DecimalFormat 格式化,實作通用工具方法:
max 位小數 (四捨五入)。0.00 → 0, 1.200 → 1.2)。min,補齊至 min 位 (如 min=2,1.2 → 1.20)。public static BigDecimal checkNumber(String number, int min, int max) {
// 1. 先按最大位格式化 (四捨五入)
DecimalFormat df = new DecimalFormat("0." + "0".repeat(max));
String formatted = df.format(Double.parseDouble(number));
BigDecimal bd = new BigDecimal(formatted);
// 2. 去除科學記號與首尾多餘 0
String val = bd.stripTrailingZeros().toPlainString(); // 1.200 -> "1.2", 0.00 -> "0"
// 3. 計算實際小數位
int idx = val.indexOf('.');
int len = (idx == -1) ? 0 : val.length() - idx - 1;
// 4. 不足最小位則補齊
if (len < min) {
if (len == 0 && idx == 0) bd = new BigDecimal("0.00"); // ".00" 等邊界
else bd = new BigDecimal(val).setScale(min, RoundingMode.HALF_UP);
} else {
bd = new BigDecimal(val).setScale(len, RoundingMode.HALF_UP);
}
return bd;
}
checkNumber("10.1234155", 2, 6) -> 10.123416 (max=6 四捨五入)
checkNumber("10.1", 2, 6) -> 10.10 (補齊至 min=2)
checkNumber("10.0000", 2, 6) -> 10.00 (去尾零後補齊)
checkNumber("0", 2, 6) -> 0.00 (特殊處理)
String 避免 double 精度損失 (如 0.1 在二進制無法精確表示)。BigDecimal.stripTrailingZeros() 需 JDK 1.5+,配合 toPlainString() 取得無科學記號字串。BigDecimal 全程運算,只在最後輸出時格式化。