在撰寫 .Net 運算相關的程式碼的時候,會很常遇到當你需要四捨五入時,系統算出的解果不是我們日常生活中的運算結果,舉個簡單的小例子:
當我們有 1.5 跟 2.5 的數字要使用 Math.Round 對整數四捨五入時就會發現,輸出都是 “2”,那究竟為甚麼 .Net 會輸出這樣的結果出來呢?這是因為 .Net 所使用的四捨五入算法是”銀行家”算法(銀行家算法:四捨六入五考慮,五後非零就進一,五後為零看奇偶,五前為偶應捨去,五前為奇要進一),所以會導致出來的結果會跟我們平常學習的四捨五入不相同。
Math.Round(1.5); //output: 2
Math.Round(2.5); //output: 2
解決方法 – MidpointRounding
如果在 Math.Round 後面加入 MidpointRounding.AwayFromZero 這個列舉型別就可以解決四捨五入的問題
Math.Round(1.5, MidpointRounding.AwayFromZero) //output: 2
Math.Round(2.5, MidpointRounding.AwayFromZero) //output: 3
Math.Round(1.55, 1, MidpointRounding.AwayFromZero) //output: 1.6
Math.Round(1.54, 1, MidpointRounding.AwayFromZero) //output: 1.5
也是可以參考以下 Function 寫法,可以自己寫出四捨五入的方法
public double GetRounding(double number, int decimalPoints)
{
double decimalPowerOfTen = Math.Pow(10, decimalPoints);
if (decimalPowerOfTen < 0)
return Math.Floor(number * decimalPowerOfTen - 0.5) / decimalPowerOfTen;
else
return Math.Floor(number * decimalPowerOfTen + 0.5) / decimalPowerOfTen;
}