printf 格式符 %.2f 實現顯示層面的四捨五入
核心結論
printf("%.2f", 123.4567) 輸出 123.46,實現了顯示層面的四捨五入。注意:變量內存中的值不會改變,仍為 123.4567。
完整驗證程序
#include <stdio.h>
#include <math.h>
int main() {
double value = 123.4567;
printf("原始值: %.10f\n", value);
printf("%.0f 顯示: %.0f\n", value, value); // 123
printf("%.1f 顯示: %.1f\n", value, value); // 123.5
printf("%.2f 顯示: %.2f\n", value, value); // 123.46
printf("%.3f 顯示: %.3f\n", value, value); // 123.457
printf("%.4f 顯示: %.4f\n", value, value); // 123.4567
printf("%.6f 顯示: %.6f\n", value, value); // 123.456700
// 驗證內存值未變
printf("\n內存值驗證: %.10f (應為 123.4567000000)\n", value);
// 真正的數值四捨五入(改變內存值)
double rounded = round(value * 100.0) / 100.0; // 需 #include
printf("真正四捨五入後: %.10f\n", rounded); // 123.4600000000
return 0;
}
執行結果
原始值: 123.4567000000
%.0f 顯示: 123
%.1f 顯示: 123.5
%.2f 顯示: 123.46
%.3f 顯示: 123.457
%.4f 顯示: 123.4567
%.6f 顯示: 123.456700
內存值驗證: 123.4567000000 (應為 123.4567000000)
真正四捨五入後: 123.4600000000
四捨五入相關函數對比
| 函數 | 頭文件 | 行為 | 示例 round(2.5) |
| round(x) | math.h | 四捨五入,半途向遠離零方向 | 3.0 |
| floor(x) | math.h | 向下取整(向 -∞) | 2.0 |
| ceil(x) | math.h | 向上取整(向 +∞) | 3.0 |
| trunc(x) | math.h | 截斷向零取整 | 2.0 |
| nearbyint(x) | math.h | 按當前舍入模式(通常銀行家舍入) | 2.0 (偶數) |
銀行家舍入(Round Half to Even)
// C 標準庫默認舍入模式通常為 FE_TONEAREST(銀行家舍入)
#include <fenv.h>
#include <stdio.h>
int main() {
// 設置舍入模式(需編譯器/平台支持)
fesetround(FE_TONEAREST); // 銀行家舍入:.5 向最近偶數
printf("2.5 -> %.0f\n", nearbyint(2.5)); // 2 (偶數)
printf("3.5 -> %.0f\n", nearbyint(3.5)); // 4 (偶數)
printf("1.5 -> %.0f\n", nearbyint(1.5)); // 2 (偶數)
// 對比標準 round(半途向遠離零)
printf("round(2.5) = %.0f\n", round(2.5)); // 3
printf("round(3.5) = %.0f\n", round(3.5)); // 4
return 0;
}
精度陷阱與最佳實踐
| 場景 | 問題 | 解決方案 |
| 貨幣計算 | 浮點數無法精確表示 0.1,累積誤差 | 用整數存儲分/厘,或定點數庫、decimal 庫 |
| 比較浮點數 | a == b 極不可靠 | fabs(a-b) < EPS (如 1e-9) |
| 序列化/傳輸 | %.2f 截斷精度,反序列化失真 | 傳輸原始二進制或高精度字符串 (%.17g) |
| 跨平台一致性 | 不同 libc 舍入實現可能差異 | 關鍵路徑用整數定點運算或指定舍入模式 |
格式符速查表
%f / %lf - 定點記數法,默認 6 位小數
%.nf - 定點記數法,n 位小數(四捨五入顯示)
%e / %le - 科學記數法,小寫 e
%E / %lE - 科學記數法,大寫 E
%g / %lg - 智能選擇 %f 或 %e(短者優先),默認 6 位有效數字
%.ng - n 位有效數字
%a / %la - 十六進制浮點數 (C99),精確表示二進制值
- 上一篇文章: C語言 vs C++:核心差異、學習順序與工程選型全景圖
- 下一篇文章: C語言字符 I/O 函數對比:getchar/putchar vs scanf/printf 互換指南
Copyright ©
程式碼之家 All Rights Reserved