zoukankan      html  css  js  c++  java
  • C#中Math.Round()实现中国式四舍五入

    C#中Math.Round()实现中国式四舍五入

        /// <summary>
            /// 四舍五入 小数点后不保留
            /// </summary>
            public static Decimal MathRound(object value)
            {
                try
                {
                    string dData = value.ToString();
                    Decimal dvalue;
                    if (value.ToString().Contains("E"))  //防止科学计数法的数字带e,出现异常
                    {
                        dvalue = Decimal.Parse(dData, System.Globalization.NumberStyles.Float);
                    }
                    else
                    {
                        dvalue = decimal.Parse(value.ToString());
                    }
                    //  Trace.WriteLine(value.ToString());
                    return Math.Round(dvalue, 0, MidpointRounding.AwayFromZero);
    
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(value.ToString() + ex.Message);
                    throw ex;
    
                }
    
            }

     

    C#中的Math.Round()并不是使用的"四舍五入"法。其实在VB、VBScript、C#、J#、T-SQL中Round函数都是采用Banker's rounding(银行家算法),即:四舍六入五取偶。事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法。

    .NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的"四舍五入"。即: Math.Round(4.5, MidpointRounding.AwayFromZero) = 5。

    复制代码
    Round(Decimal)
    Round(Double)
    Round(Decimal, Int32)
    Round(Decimal, MidpointRounding)
    Round(Double, Int32)
    Round(Double, MidpointRounding)
    Round(Decimal, Int32, MidpointRounding)
    Round(Double, Int32, MidpointRounding)
    复制代码

     如:

    Math.Round(0.4) //result:0

    Math.Round(0.6) //result:1

    Math.Round(0.5) //result:0

    Math.Round(1.5) //result:2

    Math.Round(2.5) //result:2

    Math.Round(3.5) //result:4

    Math.Round(4.5) //result:4

    Math.Round(5.5) //result:6

    Math.Round(6.5) //result:6

    Math.Round(7.5) //result:8

    Math.Round(8.5) //result:8

    Math.Round(9.5) //result:10

       使用MidpointRounding.AwayFromZero重载后对比:   

    Math.Round(0.4, MidpointRounding.AwayFromZero); // result:0

    Math.Round(0.6, MidpointRounding.AwayFromZero); // result:1

    Math.Round(0.5, MidpointRounding.AwayFromZero); // result:1

    Math.Round(1.5, MidpointRounding.AwayFromZero); // result:2

    Math.Round(2.5, MidpointRounding.AwayFromZero); // result:3

    Math.Round(3.5, MidpointRounding.AwayFromZero); // result:4

    Math.Round(4.5, MidpointRounding.AwayFromZero); // result:5

    Math.Round(5.5, MidpointRounding.AwayFromZero); // result:6

    Math.Round(6.5, MidpointRounding.AwayFromZero); // result:7

    Math.Round(7.5, MidpointRounding.AwayFromZero); // result:8

    Math.Round(8.5, MidpointRounding.AwayFromZero); // result:9

    Math.Round(9.5, MidpointRounding.AwayFromZero); // result:10

       

       

    但是悲剧的是,如果用这个计算小数的话,就不灵了!!!

    必须用第七个重载方法,
    decimal Round(decimal d, int decimals, MidpointRounding mode)

    这样计算出来的小数才是真正的中国式四舍五入!!

        

    复制代码
    ?Math.Round(526.925, 2)
    526.92
    
    ?Math.Round(526.925, 2,MidpointRounding.AwayFromZero)
    526.92
    
    ?Math.Round((decimal)526.925, 2)
    526.92
    
    ?Math.Round((decimal)526.925, 2,MidpointRounding.AwayFromZero)
    526.93
    复制代码

      

  • 相关阅读:
    用VBS脚本查询纯真IP库QQWry.dat(转)
    微软的进程监视器监视进程注册表,文件系统和线程等活动process monitor
    纯真IP库详解(转)
    VBS的开发利器WMI信息绑定参考地址
    VBS去除指定的字符串中的重复项返回重复后的字符串
    WMI中相关的操作说明execquery 或者是instancesof
    VBS字符编码的说明
    VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别(转)
    随笔我的想法
    关于ANSI字符编码的BUG问题(转)
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/14067194.html
Copyright © 2011-2022 走看看