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

C# 浮點數型別完整指南:float、double、decimal 精度、範圍、效能與選擇策略

     編輯:關於C#

三大浮點型別對照

特性float (System.Single)double (System.Double)decimal (System.Decimal)
位元數32-bit64-bit128-bit
有效位數~7 位~15-17 位28-29 位
範圍±1.5e-45 ~ ±3.4e38±5.0e-324 ~ ±1.7e308±1.0e-28 ~ ±7.9e28
IEEE 754Binary32Binary64否 (十進制浮點)
預設值0.0f0.00.0m
字面常值1.5f1.51.5m
適用場景3D 圖形、GPU、大量陣列科學計算、一般用途財務、金融、精確十進制

精度陷阱與比較策略

// float/double 二進制無法精確表示 0.1
float f = 0.1f;      // 0.10000000149011612
double d = 0.1;      // 0.10000000000000001
decimal m = 0.1m;    // 0.1 精確

// 錯誤比較
bool bad = (0.1 + 0.2) == 0.3; // false

// 正確:容差比較
bool AlmostEqual(double a, double b, double eps = 1e-10) 
    => Math.Abs(a - b) < eps;

// 相對誤差比較 (適合大數值)
bool RelativeEqual(double a, double b, double relEps = 1e-12) {
    double diff = Math.Abs(a - b);
    double max = Math.Max(Math.Abs(a), Math.Abs(b));
    return diff <= max * relEps;
}

特殊值與檢查

double.NaN      // 非數值 (0/0, Sqrt(-1))
double.PositiveInfinity  // 1.0/0.0
double.NegativeInfinity  // -1.0/0.0

// 檢查方法
double.IsNaN(x)
double.IsInfinity(x)
double.IsFinite(x) // .NET 6+

// NaN 特性:NaN != NaN 為 true
// 唯一透過 IsNaN 或 x != x 檢測

型別轉換與溢位

// 隱含:float → double (精度提升)
double d = 1.5f;

// 顯性:double → float (可能精度遺失/溢位)
float f = (float)1.5; 

// decimal 無隱含轉換 (精度語意不同)
decimal m = (decimal)1.5;     // 從 double 需顯性
double d2 = (double)1.5m;     // 從 decimal 需顯性

// 整數轉換
float f2 = 1000000;  // 精確 (24-bit 尾數)
float f3 = 16777217; // 變 16777216 (精度遺失)

效能與記憶體考量

  • float[] 記憶體 1/2 double[],1/4 decimal[],Cache 友善
  • GPU/SIMD 原生支援 float/double,decimal 軟體模擬極慢 (10-100x)
  • Vector<float>/Vector<double> 硬體向量化,decimal 無 SIMD
  • 大量資料科學計算:優先 double 平衡精度/效能;圖形/GPU:float

選擇決策樹

需要精確十進制表示 (金額、稅率、利率)?
├─ 是 → decimal (唯一正確選擇)
└─ 否 → 需要極大範圍 (天文、物理常數)?
        ├─ 是 → double (範圍至 1e308)
        └─ 否 → 大量陣列/GPU/記憶體敏感?
                ├─ 是 → float (7 位有效數字通常足夠)
                └─ 否 → double (預設最佳平衡)

浮點型別表
精度範例

本文對應《叩響 C# 之門》第 2.2 節實數型變量教學內容

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