在 Android 開發中,將 double 類型的計算結果直接轉字串顯示在 TextView 時,常遇到「5.0」這類多餘小數點的問題。例如:
double result = 5.0;
textView.setText(String.valueOf(result)); // 顯示 "5.0",期望 "5"
若直接用 new Double(result).toString() 或 String.valueOf(),Java 預設會保留 .0,影響 UI 美觀。
Java 的 Double.toString() 遵循 IEEE 754 標準,對於整數值的浮點數會輸出 x.0 格式。這是語言層面的預設行為,非 Bug。
使用 java.text.DecimalFormat 定義格式模式,可精確控制小數位數、分組符號等。
double value = 5.0;
DecimalFormat df = new DecimalFormat("#.##"); // 最多保留兩位小數,整數不顯示小數點
String formatted = df.format(value); // "5"
double value2 = 3.14159;
String formatted2 = df.format(value2); // "3.14"
# 表示選擇性數字(前導/尾隨零不顯示)0 表示強制佔位(不足補零)"#.##########" 可保留最多 10 位小數String formatted = String.format(Locale.getDefault(), "%.2f", value).replaceAll("\\.0+$", "").replaceAll("\\.(\\d*?)0+$", ".$1");
// 或更簡單:若只需去除尾部 .0
String simple = String.format("%.2f", value).replace(".00", "").replace(".0", "");
注意:String.format 預設使用系統 Locale,可能產生逗號分隔符,建議指定 Locale.US 或 Locale.getDefault()。
若涉及金融、精確科學計算,應全程使用 BigDecimal,最後再格式化輸出:
BigDecimal bd = new BigDecimal("5.00").stripTrailingZeros();
String result = bd.toPlainString(); // "5"
// Kotlin 擴展
fun Double.formatSmart(): String = if (this == this.toLong()) toLong().toString() else this.toString()
// 使用
textView.text = 5.0.formatSmart() // "5"
textView.text = 3.14.formatSmart() // "3.14"
誤區:「
double result = (double) num1 / num2;強制轉型就能解決顯示問題」事實:強制轉型只影響運算精度,不影響 後續
toString()的輸出格式。5.0 依然會顯示為 "5.0"。
NumberFormatUtil.formatDouble(double, int maxDecimals),全專案複用。NumberFormat.getInstance(Locale) 自動適配用戶地區的數字格式(如歐洲用逗號作小數點)。Math.abs(value - Math.round(value)) < 1e-10 而非 value == (long)value。去除 Double 顯示多餘的 .0 純屬格式化問題,DecimalFormat 是功能最全、最標準的解法;Kotlin 專案可寫擴展函數簡化調用。切記:運算用 double/BigDecimal,顯示用 Formatter,分離關注點才是良好架構。