求 1 到 100 (含) 之間所有奇數的平均值。
#include
#define BEGIN 1
#define END 100
int main(void) {
int sum = 0;
int count = 0;
for (int i = BEGIN; i <= END; ++i) {
if (i % 2 == 1) {
sum += i;
++count;
}
}
double average = (double)sum / count; // 強制轉型避免整數除法截斷
printf("奇數和 = %d, 個數 = %d, 平均值 = %.2f\n", sum, count, average);
return 0;
}
奇數和 = 2500, 個數 = 50, 平均值 = 50.00
等差數列平均值 = (首項 + 末項) / 2 = (1 + 99) / 2 = 50。
double average = (double)sum / count; // 正確:雙精度除法
// double average = sum / count; // 錯誤:整數除法先算完再轉型,結果 50.000000 但精度已失
// float average = sum / count; // 同樣錯誤
鐵律:參與除法的運算元**至少有一個**為浮點型別,才會執行浮點除法。
int first = (BEGIN % 2) ? BEGIN : BEGIN + 1;
int last = (END % 2) ? END : END - 1;
if (first <= last) {
int n = (last - first) / 2 + 1;
int sum = n * (first + last) / 2;
double avg = (double)sum / n; // 等價於 (first + last) / 2.0
printf("平均值 = %.2f\n", avg);
}
| 錯誤 | 後果 | 修正 |
|---|---|---|
avg = sum / count 無轉型 | 整數除法,小數部份截斷 | 轉型 (double)sum 或 sum / (double)count |
float avg 精度不足 | 大數值時精度損失 | 優先用 double |
count 未初始化 | 未定義行為 | int count = 0; |
printf("平均值 = %.2f\n", average); // 固定 2 位小數
printf("平均值 = %g\n", average); // 一般格式,自動科學記號
printf("平均值 = %.*f\n", 4, average); // 動態指定小數位數