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 

 

posted @ 2019-06-06 14:53  dotnet007cn  阅读(1518)  评论(0编辑  收藏  举报