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

float 型有效位數實測:精度隨數值大小變化

     編輯:關於C語言

現象

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.31111156
22.2211246
0.221111066

總有效數字約 6~7 位,符合理論(2³ ≈ 8.3 → 6~7 位十進制)。整數部分越大,小數精度越低。

原理回顧

  • float:1 位符號 + 8 位指數 + 23 位尾數。有效二進制位 = 24(含隱含 1)。
  • 十進制有效位數 ≈ log₁₀(2²⁴) ≈ 7.22,實際保證 6 位,典型 7 位。
  • 輸出流 operator<< 默認精度 6 位總有效數字(非小數位),故觀察到上述現象。

最佳實踐

  1. 需高精度 → 用 double(15~16 位)或 long double。
  2. 財務/精確計算 → 用定點數(整數存分/厘)或十進制庫。
  3. 比較浮點數 → 用相對/絕對誤差 eps,絕不直接 ==。
  4. 輸出控制 → cout << setprecision(10) << fixed 可強制顯示更多位,但超出精度的位無意義。

總結

float 只有約 6~7 位十進制有效數字,且隨數值增大小數精度遞減。實測驗證了這一特性:2.31111 (6 位)、22.2211 (6 位)、0.221111 (6 位)。工程中嚴禁用 float 做精度敏感計算,首選 double。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved