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

C語言浮點數保留兩位小數:輸出格式化 vs 數值四捨五入的正確選擇

     編輯:C 語言問答

兩種截然不同的需求

需求方法程式碼影響範圍
僅**顯示**保留 2 位格式化輸出printf("%.2f", val);不改變變數值,後續計算仍用完整精度
**數值**四捨五入到 0.01數值修改val = round(val * 100.0) / 100.0;實際改變儲存值,後續計算使用近似值

為什麼不建議用「乘 100 加 0.5 除 100」?


// 缺陷示範
float n = 1.005f;
n = (int)(n * 100 + 0.5) / 100.0f;
// n * 100 = 100.5 (二進位無法精確表示,可能為 100.499999)
// +0.5 = 100.999999
// (int) = 100
// 結果 1.00,正確應為 1.01

二進位浮點誤差導致邊界條件失效。

正確數值四捨五入函數 (C99)


#include 
double round2(double x) {
    return round(x * 100.0) / 100.0;
}
// 負數自動正確處理:round(-1.234*100)/100 = -1.23

金融/貨幣計算:拒絕二進位浮點


// 方案一:整數分 (最推薦)
int price_cents = 1999; // 19.99 元
// 運算全用整數,顯示時分離元/分
printf("%d.%02d", price_cents/100, price_cents%100);

// 方案二:定點數結構體
typedef struct { int integer; int fraction; } Money; // fraction 0~99

// 方案三:C23 _Decimal64 / 第三方 decNumber 庫

總結建議

  1. 單純列印 → printf("%.2f")。
  2. 一般科學計算需近似值 → round(x*100)/100。
  3. 涉及錢 → **整數分** 或十進位浮點庫。
  4. 避免手寫 (int)(x*100+0.5)/100.0,邊界誤差極難除錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved