C Primer Plus 習題:計算水分子數量,結果極大(~3.17×10²⁵),使用 `%f` 輸出大量無意義的 0,`%g` 進行了四捨五入。如何選擇合適的格式符?
| 格式符 | 含義 | 輸出示例 (3.1768e25) | 適用場景 |
|---|---|---|---|
%f | 十進制固定點表示 | 31767999999999998000000000.000000 | 小數位固定、金額、表格對齊 |
%e / %E | 科學計數法(e/E 分隔) | 3.176800e+25 / 3.176800E+25 | 科學計算、極大/極小數、日誌記錄 |
%g / %G | 自動選擇 %f 或 %e(較短者),移除尾部無意義 0 | 3.1768e+25 | 通用輸出、人類閱讀、不需固定精度 |
%a / %A (C99) | 十六進制浮點數 (p 記數法) | 0x1.0p+84 | 底層調試、精確二進制表示、跨平台數值交換 |
`%g` 默認精度為 6 位有效數字(非小數位)。3.1768e25 有 5 位有效數字,故顯示為 3.1768e+25。若需更高精度,用 `.精度g`:
printf("%.10g", 3.1768e25); // 3.1768e+25 (仍 5 位有效數字)
printf("%.15g", 3.1768e25); // 3.17679999999999e+25
`double` 約 15-17 位十進制有效數字,超出部分為垃圾值,`%f` 強制展開所有位數導致大量尾隨 0/亂碼。
printf("%.15e", 3.1768e25); // 3.176799999999999e+25 (15 位有效數字)
long double result = x * K * G;
// 方案 A:科學計數法,保留 6 位有效數字(推薦)
printf("水分子數量為: %.6e\n", result); // 3.176800e+25
// 方案 B:%g 自動選擇,指定 10 位有效數字
printf("水分子數量為: %.10g\n", result); // 3.1768e+25
// 方案 C:若需精確整數輸出(長整數),需用任意精度庫(GMP)或手動大整數乘法
// C 標準庫無法直接輸出 25 位整數的精確值
%f 固定點 %e 科學計數法(e) %g 通用(短者) %a 十六進制浮點
%F 同%f(大寫NAN/INF) %E 科學計數法(E) %G 通用(大寫) %A 十六進制大寫