float,double,decimal的區別於誤解

轉自: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章