在工作上,花了很多時間一直在找尋這個 bug,決定寫在這裡。
Math.Round()
在 C# 中,Math.Round() 這是IEEE的規格, 機率而言這樣比較公平,其規則如下:
小數>5:進位
小數<5:捨去
小數=5: 看前一位, 偶數捨去, 奇數進位
ex:Math.Round(1.2) ==>1.0
ex:Math.Round(1.6) ==>2.0
ex:Math.Round(1.5) ==>2.0
ex:Math.Round(2.5) ==>2.0
但我們一般所熟知的四捨五入,則是>= 5 便進位
ex:Math.Round(1.6) ==>2.0
ex:Math.Round(2.5) ==>3.0
因此我們必須在方法後面加上 MidpointRounding.AwayFromZero
例如:Math.Round(120.65, 1 , MidpointRounding.AwayFromZero)
這樣輸出就會是 120.7
但當我們輸入(double) 2.135 及(double) 3.135 會發現用 Math.Round(value, 2, MidpointRounding.AwayFromZero)
分別傳回的竟然是 2.13 及 3.14 跟我們所想的不一樣
主要是因為在某些數值下, 浮點數在四捨五入會有出乎意料的值
因此請將型態改成 Decimal 記得數字後都加上m,會比較精確