zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    [java,2019-01-28] 枪手博弈,谁才是最后赢家
    [java,2019-01-25] 图片和二进制互转
    [java,2019-01-15] word转pdf
    [python,2018-06-29] 37%法则及其拓展解决恋爱问题
    [java,2018-06-26] 扑克牌抽牌求和问题
    [python,2018-06-25] 高德纳箭号表示法
    [java,2017-06-12] myEclipse双击无法打开文件
    OpenGL核心技术之法线贴图
    游戏中水的渲染技术系列一
    Unity 3D实现帧同步技术
  • 原文地址:https://www.cnblogs.com/chinasoft/p/15238203.html
Copyright © 2011-2022 走看看