首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 高精度數值計算:指定小數位數、去尾零、最小位數補齊

     編輯:Java 相關知識

金融、計量等場景需精確控制小數位。使用 BigDecimal 避免浮點誤差,輔以 DecimalFormat 格式化,實作通用工具方法:

  • 最大保留 max 位小數 (四捨五入)。
  • 移除首尾多餘 0 (如 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 全程運算,只在最後輸出時格式化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved