轉自:https://blog.csdn.net/m1654399928/article/details/54729409
在精確計算中使用浮點數是非常危險的,儘管C#在浮點數運算時採取了很多措施使得浮點數運算的結果看起來是非常正常的。但實際上如果不清楚浮點數的特性而貿然使用的話,將造成非常嚴重的隱患。
考慮下面的語句:
double dd = 10000000000000000000000d;
dd += 1;
Console.WriteLine ( "{0:G50}", dd );
輸出是什麼?誰知道?
輸出是:1000000000000000000000000
這就是浮點數精度損失的問題,最重要的是,在精度損失的時候,不會報告任何的錯誤,也不會有任何的異常產生。
浮點數的精度損失可能在很多地方出現,例如d * g / g 不一定等於d,d / g * g也不一定等於d。
應該是decimal的精度是double的兩倍,float(single)的四倍吧 decimal的精度是double的兩倍,float(single)的四倍,
就大小而言,decimal還不及float吧
類型 大致範圍 精度
----------------------------------------------------------------
float ±1.5 × 10^(−45) 到 ±3.4 × 10^38 7 位
double ±5.0 × 10^(−324) 到 ±1.7 × 10^308 15 到 16 位
decimal ±1.0 × 10^(−28) 到 ±7.9 × 10^28 28 到 29 位有效位
還有兩個非常危險的錯誤認識!!
1、decimal不是浮點型、decimal不存在精度損失。
下面有段程序大家可以去看看結果是什麼。記住!所有的浮點型變量都存在精度損失的問題,而decimal是一個不折不扣的浮點型,不論它精度有多高,精度損失依然存在!
decimal dd = 10000000000000000000000000000m;
dd += 0.1m;
Console.WriteLine ( "{0:G50}", dd );
2、decimal所能儲存的數比double大,從double到decimal的類型轉換不會出現任何問題。
微軟在decimal的幫助上真的要好好反省了。實際上只有從整形到decimal的轉換纔是擴大轉換,decimal的精度比double大,但所能儲存的最大數卻比double要小。
————————————————
版權聲明:本文爲CSDN博主「從_零_開始」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m1654399928/article/details/54729409