[.NET]Math.Round(decimal, Int32) 與 Math.Round(Double, Int32)

[.net]Math.Round(decimal, Int32) 與 Math.Round(Double, Int32)

在MSDN論譠上有看到「小數點捨入問題」。

第1個問題是常遇到的 四捨六入五成雙 的問題,如下,

decimal g = Math.Round((decimal)4.125, 2); // 4.12
decimal h = Math.Round((decimal)4.135, 2); // 4.14

 

如果要像我們一般認知的4捨5入的話,就要設定 MidpointRounding.AwayFromZero ,如下,

decimal i = Math.Round((decimal)4.125, 2, MidpointRounding.AwayFromZero); // 4.13
decimal j = Math.Round((decimal)4.135, 2, MidpointRounding.AwayFromZero); // 4.14

 

可參考: Math.Round 方法 (Decimal, Int32, MidpointRounding)

 

另一個問題是說,一個明明要進位,卻沒有進位的問題,2.1555取到小數2位應該是要2.16呀,為何出來的是2.15呢? 如下,

double c = Math.Round((double)2.155, 2 ); // 2.15
double f = Math.Round((double)4.155, 2); // 4.16

 

這個問題可參考: Math.Round 方法 (Double, Int32)

因為double是非精準數值,所以Round時,會先轉成10進位,然後再來處理Round。所以因此造成該進位而沒進位的狀況。

所以如果要依精準運算的話,請使用精準資料型態,如decimal。

所以如果使用decimal就是我們所認知的進位情形了,如下,

decimal a = Math.Round((decimal)2.155, 2); // 2.16
decimal b = Math.Round((decimal)4.155, 2); // 4.16

 

DB的欄位的設計也是相同的情況哦! 可參考「資料庫使用FLOAT欄位來記錄金額對嗎?」。

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^