首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 新手溫度轉換:整數除法陷阱與 DecimalFormat 格式化

     編輯:程式設計綜合問答

初學 Java 寫攝氏度轉華氏度(`f = c * 9/5 + 32`)時,常遇到兩個問題:結果精度丟失(整數除法) 和 小數位數不固定。本文通過經典案例拆解成因並給出標準解法。

問題代碼與現象

Scanner in = new Scanner(System.in);
int c = in.nextInt();
double f = c * 9 / 5 + 32; // 錯誤:整數運算
System.out.println(f);     // 輸入 37 → 輸出 98.0 (預期 98.6)

**現象**:無論輸入多少,結果小數部分總是 `.0`。

成因分析:整數除法截斷

Java 中 `int` 與 `int` 運算結果仍為 `int`。表達式 `c * 9 / 5` 從左到右計算:

  1. `c * 9` → `int` 結果(如 37*9=333)。
  2. `333 / 5` → **整數除法**,結果為 `66`(小數 `.6` 被截斷)。
  3. `66 + 32` → `98` (int)。
  4. 賦值給 `double f` → `98.0`。

修正方案一:引入浮點數字面量

只要參與運算的任一操作數是浮點類型,整個表達式提升為浮點運算。最簡單方式:乘以 `1.0` 或將 `9` 改為 `9.0`。

double f = c * 9.0 / 5 + 32;  // 或 c * 1.0 * 9 / 5 + 32
// 輸入 37 → 98.6

修正方案二:格式化輸出保留兩位小數

使用 `java.text.DecimalFormat` 或 `String.format` / `printf` 控制輸出格式。

方式 A:DecimalFormat(推薦復雜格式)

double f = c * 9.0 / 5 + 32;
DecimalFormat df = new DecimalFormat("#.00"); // 0 強制顯示,# 不顯示前導/尾隨零
System.out.println(df.format(f)); // 98.60
  • `#.00`:至少保留兩位小數,整數部分無前導零。
  • `0.00`:整數部分也強制顯示一位(如 `05.00`)。

方式 B:String.format / printf(推薦簡單輸出)

System.out.printf("華氏度: %.2f°F%n", f); // 98.60°F
// 或
String formatted = String.format("%.2f", f);

完整最佳實踐代碼

import java.util.Scanner;
import java.text.DecimalFormat;

public class TempConvert {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("請輸入攝氏度: ");
        int c = in.nextInt();
        
        // 1. 浮點運算保證精度
        double f = c * 9.0 / 5 + 32;
        
        // 2. 格式化輸出
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println("華氏度: " + df.format(f) + "°F");
        
        // 也可直接 printf
        System.out.printf("華氏度: %.2f°F%n", f);
    }
}

核心知識點總結

  • 整數除法截斷: `int / int` → `int`。解決:引入 `double` 字面量(`9.0`、`1.0`)或強轉 (`(double)c`)。
  • 浮點數精度: `double` 為雙精度,足夠日常計算;金融計算請用 `BigDecimal`。
  • 格式化工具: `DecimalFormat` 靈活強大;`printf`/`String.format` 簡潔標準,C 風格開發者更熟悉。

掌握這兩點,溫度轉換與各類數值計算將不再出現「少位小數」的尷尬。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved