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

C 語言溫度轉換:華氏度轉攝氏度公式實現與浮點精度陷阱

     編輯:關於C語言

問題描述

輸入華氏溫度,按公式 C = 5/9 × (F - 32) 轉換為攝氏溫度。核心考點:整數除法截斷陷阱、浮點字面量強制類型、公式運算順序。

原代碼分析


#include <stdio.h>

int main() {
    float C, F;
    printf("請輸入華氏溫度: ");
    scanf("%f", &F);
    C = 5.0/9 * (F - 32);  // 關鍵:5.0 強制浮點除法
    printf("%.3f 華氏度 = %.3f 攝氏度\n", F, C);
    return 0;
}

致命陷阱:5/9 整數除法 = 0


// ❌ 錯誤寫法
C = 5/9 * (F - 32);   // 5/9 = 0 (整數除法),結果恆為 0

// ❌ 錯誤寫法
C = (5/9) * (F - 32); // 同上,括號不改變整數除法

// ✅ 正確寫法 (任一)
C = 5.0/9 * (F - 32);     // 5.0 是 double,提升整個表達式
C = 5.0f/9 * (F - 32);    // 5.0f 是 float
C = (float)5/9 * (F - 32); // 強制轉換
C = 5/9.0 * (F - 32);     // 9.0 是 double

運算順序與精度分析


// 方案 A: 5.0/9 * (F-32)
// 步驟: 5.0/9 → 0.555... → ×(F-32)
// 誤差: 5/9 無限循環小數,double 約 15 位精度

// 方案 B: (F-32) * 5 / 9
// 步驟: (F-32)×5 → 再除 9
// 優勢: 先乘後除,中間結果較大,相對精度略好
// 推薦: C = (F - 32) * 5.0 / 9;

測試用例驗證

華氏度 F攝氏度 C (公式)關鍵點
320冰點
212100沸點
-40-40兩制相等點
98.637人體正常溫度
0-17.777...華氏零度

擴展:雙向轉換函數封裝


float f_to_c(float f) { return (f - 32) * 5.0f / 9; }
float c_to_f(float c) { return c * 9.0f / 5 + 32; }

// 通用轉換
typedef enum { FAHRENHEIT, CELSIUS } Scale;
float convert(float temp, Scale from, Scale to) {
    if (from == to) return temp;
    if (from == FAHRENHEIT) return f_to_c(temp);
    return c_to_f(temp);
}

格式化輸出建議


// 原代碼 %3f 寬度3右對齊,小數點後6位(默認)
// 建議:
printf("%.2f °F = %.2f °C\n", F, C);  // 兩位小數,人類閱讀友好
// 科學計算:
printf("%.6f °F = %.6f °C\n", F, C);  // 六位小數

總結

華氏轉攝氏是「整數除法陷阱」的經典教學案例。關鍵收穫:

  • 5/9 = 0 是 C/ C++ 整數除法特性,必須用 5.0/9 或 5/9.0;
  • 推薦順序 (F-32) * 5.0 / 9 先乘後除減輕精度損失;
  • float 足夠溫度轉換精度 (7 位有效數字);
  • 封裝轉換函數提高復用性,枚舉類型擴展支持開爾文等;
  • 輸出 %.2f 平衡精度與可讀性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved