C#中級、double和decimal區(qū)別解析
在 C# 中,double 和 decimal 都是用來表示帶小數(shù)的數(shù)值類型,但它們在內(nèi)部表示、精度、性能和適用場景上有本質(zhì)區(qū)別。選擇錯誤的類型可能導(dǎo)致嚴重精度問題(尤其在金融計算中)。
? 一句話總結(jié)區(qū)別
double:64 位雙精度浮點數(shù),基于 IEEE 754 標準,速度快、范圍大,但有舍入誤差 → 適合科學(xué)計算、圖形、物理模擬。decimal:128 位高精度十進制數(shù),無二進制舍入誤差,專為金融和貨幣計算設(shè)計 → 精確但速度慢、范圍小。
?? 詳細對比表
| 特性 | double | decimal |
|---|---|---|
| 關(guān)鍵字 | double | decimal |
| .NET 類型 | System.Double | System.Decimal |
| 存儲大小 | 64 位(8 字節(jié)) | 128 位(16 字節(jié)) |
| 精度 | 約 15-17 位有效數(shù)字 | 28-29 位有效數(shù)字 |
| 數(shù)值范圍 | ±5.0 × 10?³²? 到 ±1.7 × 10³?? | ±1.0 × 10?²? 到 ±7.9 × 10²? |
| 內(nèi)部表示 | 二進制浮點(以 2 為底) | 十進制浮點(以 10 為底) |
| 是否精確表示 0.1? | ? 不能(有舍入誤差) | ? 能(精確) |
| 性能 | ? 快(CPU 硬件直接支持) | ?? 慢(軟件模擬) |
| 默認字面量后綴 | 無(如 3.14 是 double) | 需加 m 或 M(如 3.14m) |
?? 關(guān)鍵區(qū)別:精度 vs 速度
?double的經(jīng)典陷阱:0.1 + 0.2 ≠ 0.3
double a = 0.1; double b = 0.2; double sum = a + b; Console.WriteLine(sum == 0.3); // False! Console.WriteLine(sum); // 0.30000000000000004
原因:
0.1在二進制中是無限循環(huán)小數(shù),無法精確表示。
?decimal精確計算:
decimal a = 0.1m; decimal b = 0.2m; decimal sum = a + b; Console.WriteLine(sum == 0.3m); // True! Console.WriteLine(sum); // 0.3
?? 字面量寫法注意
// double(默認) double d1 = 123.45; // OK double d2 = 123.45d; // 顯式 d 后綴(可選) // decimal(必須加 m/M) decimal m1 = 123.45m; // ? 正確 decimal m2 = 123.45; // ? 編譯錯誤!會先當作 double,再隱式轉(zhuǎn)換(可能丟失精度)
?? 永遠不要寫
decimal x = 0.1;—— 這會先創(chuàng)建一個不精確的double,再轉(zhuǎn)成decimal,錯誤已發(fā)生!
?? 適用場景對比
? 使用double的場景:
- 科學(xué)計算(物理、工程)
- 圖形渲染、游戲開發(fā)(坐標、速度)
- 機器學(xué)習、統(tǒng)計分析
- 對性能敏感、允許微小誤差的場景
? 使用decimal的場景:
- 金融、會計、貨幣計算(必須精確到分)
- 稅務(wù)計算
- 任何需要十進制精確表示的業(yè)務(wù)邏輯
- 用戶輸入的金額、價格等
?? 黃金法則:
“涉及錢的地方,永遠用decimal!”
?? 常見誤區(qū)
? 誤區(qū) 1:decimal能表示任意大的數(shù)
雖然
decimal精度高,但最大值只有約 7.9 × 10²?,遠小于double的 10³??。
如果需要超大數(shù),考慮BigInteger(整數(shù))或自定義類型。
? 誤區(qū) 2:decimal性能差到不能用
雖然比
double慢(約 10-20 倍),但在現(xiàn)代 CPU 上,一次decimal加法仍只需幾十納秒。
對于金融系統(tǒng)(每秒幾百筆交易),完全夠用。
? 誤區(qū) 3:可以用double存金額,只要四舍五入
即使顯示時四舍五入,內(nèi)部累積誤差仍會導(dǎo)致對賬不平!
例如:1000 次 0.1 元累加,double可能變成 99.99999999999999。
? 最佳實踐建議
| 場景 | 推薦類型 |
|---|---|
| 金額、價格、利率 | decimal |
| 科學(xué)/工程計算 | double |
| 數(shù)據(jù)庫字段 | 金額用 DECIMAL(p,s),科學(xué)數(shù)據(jù)用 FLOAT/DOUBLE |
| API 設(shè)計 | 金融接口參數(shù)/返回值用 decimal |
| 常量定義 | public const decimal TaxRate = 0.13m; |
?? 總結(jié)
| 問題 | 答案 |
|---|---|
| 哪個更精確? | decimal(十進制無誤差) |
| 哪個更快? | double(硬件加速) |
| 存錢用哪個? | 必須用 decimal |
| 0.1 能精確表示嗎? | double ?,decimal ? |
| 字面量怎么寫? | double: 3.14;decimal: 3.14m |
?? 記?。?br />“
double為速度而生,decimal為正確而戰(zhàn)。”
在金融世界里,一分錢都不能錯——這就是decimal的存在意義。
問題
double和float有什么區(qū)別
double占用64位內(nèi)存,而float占用32位
什么是NaN
NaN表示非數(shù)字,它是double或float可以具有特殊值,0除以0的結(jié)果
到此這篇關(guān)于C#中級、double和decimal有什么區(qū)別的文章就介紹到這了,更多相關(guān)C# 中級、double和decimal區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 使用鼠標點擊對Chart控件實現(xiàn)數(shù)據(jù)提示效果
這篇文章主要介紹了C# 使用鼠標點擊對Chart控件實現(xiàn)數(shù)據(jù)提示效果,文章給予上一篇的詳細內(nèi)容做延伸介紹,需要的小伙伴可任意參考一下2022-08-08
基于WPF+Prism實現(xiàn)動態(tài)分頁加載圖片的方法
在做圖片瀏覽器程序時,遇到圖片數(shù)量巨大的情況(如幾百張、上千張),一次性加載所有圖片會導(dǎo)致界面卡頓甚至程序崩潰,所以本文介紹了基于WPF?+?Prism實現(xiàn)動態(tài)分頁加載圖片的方法,需要的朋友可以參考下2025-09-09
C#使用ODBC與OLEDB連接數(shù)據(jù)庫的方法示例
這篇文章主要介紹了C#使用ODBC與OLEDB連接數(shù)據(jù)庫的方法,結(jié)合實例形式分析了C#基于ODBC與OLEDB實現(xiàn)數(shù)據(jù)庫連接操作簡單操作技巧,需要的朋友可以參考下2017-05-05

