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

C語言浮點數四捨五入輸出:printf 格式控制與數值處理

     編輯:C 語言問答

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;
}

精度陷阱與最佳實踐

格式符速查表

%f / %lf   - 定點記數法,默認 6 位小數
%.nf       - 定點記數法,n 位小數(四捨五入顯示)
%e / %le   - 科學記數法,小寫 e
%E / %lE   - 科學記數法,大寫 E
%g / %lg   - 智能選擇 %f 或 %e(短者優先),默認 6 位有效數字
%.ng       - n 位有效數字
%a / %la   - 十六進制浮點數 (C99),精確表示二進制值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景問題解決方案
貨幣計算浮點數無法精確表示 0.1,累積誤差用整數存儲分/厘,或定點數庫、decimal 庫
比較浮點數a == b 極不可靠fabs(a-b) < EPS (如 1e-9)
序列化/傳輸%.2f 截斷精度,反序列化失真傳輸原始二進制或高精度字符串 (%.17g)
跨平台一致性不同 libc 舍入實現可能差異關鍵路徑用整數定點運算或指定舍入模式