Math.Round() 四捨五入 (Y)

  • 1366
  • 0
  • C#
  • 2021-08-19

在工作上,花了很多時間一直在找尋這個 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,會比較精確