在 Java 開發中,處理浮點數精度是常見需求。無論是金融計算、科學計算還是日常業務邏輯,我們經常需要將 double 或 float 類型的數值保留指定位數的小數。本文介紹一種簡潔且標準的做法:利用 java.text.NumberFormat 類別實現小數位數的精確控制。
NumberFormat 是 Java 提供的格式化數字的抽象基類,透過 getNumberInstance() 可獲得預設的數字格式化器。關鍵在於呼叫 setMaximumFractionDigits(int) 方法設定最大小數位數,格式化時會自動進行四捨五入。最後再將格式化後的字串解析回 double 型別即可。
import java.text.NumberFormat;
public class DecimalFormatter {
/**
* 保留指定位數的小數(四捨五入)
*
* @param number 待處理的數值
* @param digit 要保留的小數位數
* @return 格式化後的數值
*/
public static double saveNumber(double number, int digit) {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(digit);
// 設定不使用分組分隔符(如逗號),避免解析失敗
formatter.setGroupingUsed(false);
String formatted = formatter.format(number);
return Double.parseDouble(formatted);
}
public static void main(String[] args) {
double value = 15.12312312;
double result = saveNumber(value, 6);
System.out.println("原始值:" + value);
System.out.println("保留 6 位小數:" + result);
// 輸出:15.123123
}
}
format() 方法會依照標準四捨五入規則處理超出位數的部分。NumberFormat 可能會加入千分位分隔符(如 1,234.56),這會導致 Double.parseDouble() 拋出異常,因此必須呼叫 setGroupingUsed(false)。BigDecimal。對於需要精確控制捨入模式(如 ROUND_HALF_UP、ROUND_DOWN 等)或進行連續運算的場景,BigDecimal 是更專業的選擇:
import java.math.BigDecimal;
import java.math.RoundingMode;
public static double saveNumberWithBigDecimal(double number, int digit) {
BigDecimal bd = BigDecimal.valueOf(number);
bd = bd.setScale(digit, RoundingMode.HALF_UP);
return bd.doubleValue();
}
使用 NumberFormat 保留小數位數代碼簡潔、語義清晰,適合大多數一般性需求。開發者應根據業務對精度與效能的具體要求,在 NumberFormat、BigDecimal 甚至 String.format() 之間做出選擇。