題目選項分析
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 截斷特性實現四捨五入
| 步驟 | 運算 | n=1.234 示例 | 說明 |
| 1. 放大 100 倍 | n * 100 | 123.4 | 將百位移到個位 |
| 2. 加 0.5 | + 0.5 | 123.9 | ≥0.5 進位,<0.5 不變 |
| 3. 強制轉 int (截斷) | (int) / 賦值給 int m | 123 | 關鍵:丟棄小數部分 |
| 4. 縮小 100 倍 | / 100.0 | 1.23 | 恢復小數位置 |
為什麼選 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 結果 |
| A | 全程 float 運算,無截斷步驟,123.9 / 100.0 = 1.239 | 1.239 ❌ |
| C | 運算優先級錯誤:0.5 / 100.0 = 0.005 先執行 | 123.405 ❌ |
| D | 邏輯顛倒:先除後乘,放大的是整數部分 | 100.5 ❌ |
通用模板 (含負數處理)
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`,標準、精確、可讀
- 上一篇文章: ASP.NET __doPostBack 中 onsubmit 與 onsubmit() 差異解析
- 下一篇文章: C# WinForms 按鈕功能提示:使用 ToolTip 元件顯示說明文字
Copyright ©
程式碼之家 All Rights Reserved