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 
  • 相关阅读:
    NYOJ-开灯问题
    cocos2dx 3.0 飞机大战
    Java 实现享元(Flyweight)模式
    MongoDB 操作手冊CRUD查询指针
    均值滤波
    cxf调用c#的webservice
    SharePoint 2013 术语和术语集介绍
    Unity3d 网络编程(二)(Unity3d内建网络各项參数介绍)
    linux服务器在运行210天左右宕机
    好的用户界面-界面设计的一些技巧
  • 原文地址:https://www.cnblogs.com/chinasoft/p/15238203.html
Copyright © 2011-2022 走看看