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

C 語言浮點數四捨五入保留兩位小數:整數運算法原理解析

     編輯:程式設計綜合問答

題目選項分析

A) n = (n*100 + 0.5) / 100.0
B) m = n*100 + 0.5; n = m / 100.0
C) n = n*100 + 0.5 / 100.0
D) n = (n/100 + 0.5) * 100.0

正確答案:B

逐步推導 (以 n = 1.234 為例)

核心原理:利用 int 截斷特性實現四捨五入

為什麼選 B?

// B 選項完整展開
float n = 1.234;
int m;
m = n * 100 + 0.5;  // m = 123 (int 截斷)
n = m / 100.0;      // n = 1.23 (float 除法)
✅ 正確:先用 int 截斷實現四捨五入,再轉回 float

其他選項錯誤分析

步驟運算n=1.234 示例說明
1. 放大 100 倍n * 100123.4將百位移到個位
2. 加 0.5+ 0.5123.9≥0.5 進位,<0.5 不變
3. 強制轉 int (截斷)(int) / 賦值給 int m123關鍵:丟棄小數部分
4. 縮小 100 倍/ 100.01.23恢復小數位置

通用模板 (含負數處理)

float round2(float n) {
    int m;
    if (n >= 0)
        m = (int)(n * 100 + 0.5);
    else
        m = (int)(n * 100 - 0.5);  // 負數減 0.5
    return m / 100.0f;
}

// C99 標準庫函數 (推薦生產碼用)
#include <math.h>
float r = roundf(n * 100) / 100.0f;  // 正確處理所有邊界

浮點數精度陷阱警示

// 看似正確實則危險
float n = 1.235;  // 二進位無法精確表示
// n * 100 可能是 123.4999999...
// +0.5 → 123.9999999...
// (int) → 123 (應為 124)

// 解決:加微小 epsilon
m = (int)(n * 100 + 0.5 + 1e-6);

總結

  • 關鍵技巧:**`int` 截斷特性 + 放大縮小** 實現四捨五入
  • 選項 B 正確體現此邏輯:中間變數 `m` 為 `int` 類型
  • 生產代碼請用 `` 的 `round/roundf/lround`,標準、精確、可讀
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
選項錯誤原因n=1.234 結果
A全程 float 運算,無截斷步驟,123.9 / 100.0 = 1.2391.239 ❌
C運算優先級錯誤:0.5 / 100.0 = 0.005 先執行123.405 ❌
D邏輯顛倒:先除後乘,放大的是整數部分100.5 ❌