[C#] Math.Round 正確的使用四捨五入,解決有時候沒有進位的問題

在撰寫 .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;
}

發表迴響