代碼使用 double i 作為迴圈計數器,步長 0.1,並連續三次 printf 輸出同一變數,觀察到輸出順序「顛倒」與數值異常。
實際上順序不變,是終端機緩衝區特性誤導。三個 printf 依序執行,但標準輸出默認**行緩衝**(遇換行刷新)或**全緩衝**(重定向時)。若格式字串不含 \n 或刷新不及時,輸出會混雜顯示。建議每次 printf 結尾加 \n 或調用 fflush(stdout)。
for (i = 0; i <= 10.1; i += 0.1) // 錯誤示範
0.1 在二進位無法精確表示(類似十進位 1/3),累加產生誤差:i 可能為 1.0999999、1.2000001 等。導致:
printf("%.1lf", i) 四捨五入顯示 1.1,但 %lf 顯示完整誤差值。(int)i 截斷向零取整,產生非預期整數。for (int step = 0; step <= 101; ++step) {
double i = step * 0.1; // 或 step / 10.0
printf("%.1lf\n%lf\n%d\n", i, i, (int)i);
if (i >= 9.9) break;
}
step 控制迴圈,完全避免累積誤差。i 由精確整數轉換,數值穩定。i >= 9.9) 需用容差:fabs(i - 9.9) < 1e-9。