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

可能不少人都跟我同样,都只知道Math.Round()是C#中用来作四舍五入,保留指定小数位的算法

但实际上它并非真正的四舍五入,而是银行家算法的四舍六入五取偶函数

事实上这也是IEEE的规范,所以全部符合IEEE标准的语言都应该采用这样的算法。spa

其规则以下:code

一、当舍去位的数值小于5时。直接舍去blog

二、当舍去位的数值大于6时,进位加1class

三、当舍去位的数值等于5时,分两种状况:方法

    (1)若5后面有其余非0数字(即5不是最后一位)时,进位加1语言

 (2)若5后面只有0(即5是最后一位)时,则根据5的前一位的奇偶来判断,前一位为奇数则进位加1,为偶数则舍去di

遇到5须要舍去的状况只有一种,即5是最后一位有效数且前一位数是偶数poi

数字的精度越大,则这个算法就越像真正的四舍五入

咱们使用这个函数时,用来处理的数字一般是那些有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 
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息