float(IEEE 754 單精度)有 23 位尾數 + 1 位隱含首位 1,約 7 位十進制有效數字。但實際可保譆的十進制位數隨數值量級變化:整數部分佔用更多二進制位,留給小數部分的精度下降。
#include
using namespace std;
int main() {
float a = 2.31111111111f;
cout << a << endl; // 2.31111
float b = 22.221111111111f;
cout << b << endl; // 22.2211
float c = 0.22111111111f;
cout << c << endl; // 0.221111
return 0;
}
2.31111 22.2211 0.221111
| 值 | 整數部分位數 | 顯示小數位數 | 總有效數字 |
|---|---|---|---|
| 2.31111 | 1 | 5 | 6 |
| 22.2211 | 2 | 4 | 6 |
| 0.221111 | 0 | 6 | 6 |
總有效數字約 6~7 位,符合理論(2³ ≈ 8.3 → 6~7 位十進制)。整數部分越大,小數精度越低。
operator<< 默認精度 6 位總有效數字(非小數位),故觀察到上述現象。double(15~16 位)或 long double。eps,絕不直接 ==。cout << setprecision(10) << fixed 可強制顯示更多位,但超出精度的位無意義。float 只有約 6~7 位十進制有效數字,且隨數值增大小數精度遞減。實測驗證了這一特性:2.31111 (6 位)、22.2211 (6 位)、0.221111 (6 位)。工程中嚴禁用 float 做精度敏感計算,首選 double。