C# Math.Round()的銀行家算法


可能很多人都跟我一樣,都只知道Math.Round()是C#中用來做四舍五入,保留指定小數位的

但實際上它並不是真正的四舍五入,而是銀行家算法的四舍六入五取偶

事實上這也是IEEE的規范,因此所有符合IEEE標准的語言都應該采用這樣的算法。

其規則如下:

1、當舍去位的數值小於5時。直接舍去

2、當舍去位的數值大於6時,進位加1

3、當舍去位的數值等於5時,分兩種情況:

    (1)若5后面有其他非0數字(即5不是最后一位)時,進位加1

 (2)若5后面只有0(即5是最后一位)時,則根據5的前一位的奇偶來判斷,前一位為奇數則進位加1,為偶數則舍去

遇到5需要舍去的情況只有一種,即5是最后一位有效數且前一位數是偶數

數字的精度越大,則這個算法就越像真正的四舍五入

我們使用這個函數時,用來處理的數字通常是那些有n位小數的數字,而我們用於顯示的通常也就只有2-4位,所以這也就不容易發現這個問題

可能光是文字大家不好理解,下面寫幾個例子

Math.Round(1.14 , 1) //result:1.1  
Math.Round(1.25 , 1) //result:1 .2 五是最后一位且前一位為 偶數,也舍去
Math.Round(1.15 , 1) //result:1 .2 五是最后一位但前一位為奇數,進位加一
Math.Round(1.16 , 1) //result:1 .2

 

.NET 2.0 開始,Math.Round 方法提供了一個枚舉選項 MidpointRounding.AwayFromZero 可以用來實現傳統意義上的"四舍五入"。

Math.Round(1.25 , 1) //result:1 .2 
Math.Round(1.25 , 1, MidpointRounding.AwayFromZero) //result:1 .3 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM