zoukankan      html  css  js  c++  java
  • c#Math.Round最準確的四舍五入

    1、算法
    Math.Round 采用的是:
    "四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一"
     
    問題:
    在VS2005中 即时窗口下运行结果如下
    Math.Round(1.435,2)
    1.44
    Math.Round(2.435,2)
    2.44
    Math.Round(5.435,2)
    5.44
    Math.Round(4.435,2)
    4.43
     
    Math.Round 采用的是:
    "四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一"
    但是为什么Math.Round(4.435,2)结果是4.43
    其他的都是x.44
     
    回答:
    都说了是精度的问题了
    你试试
    Math.Round(new decimal(4.435),2)
    輸出:4.44

    所以,最好是用必須是decimal類型

    2、解決方法
    Math.Round()准确的说,这个函数不是四舍五入,而是四舍六入五凑偶,就是说小于4或大于6的该舍该入是没有争议的,而5处在正中间,如果四舍五入则会造成数据的整体偏差,所以采取的原则是:如果舍入位为5,则舍入后最后一位为偶数,这是国际惯例。
    现在做的项目都要5入,解决方法:
    目前做法是:
    (1)數字轉換成decimal類型
    (2)使用MidpointRounding.AwayFromZero
    例如:
    Math.Round(new decimal(4.4450), 2, MidpointRounding.AwayFromZero);  
    4.45
    Math.Round(new decimal(-4.4450), 2, MidpointRounding.AwayFromZero);  
    -4.45
    Math.Round(new decimal(4.4450), 2);  
    4.44
    Math.Round(4.4350, 2, MidpointRounding.AwayFromZero);  
    4.43

    (3)負數時解決:

    目前做法是:
    如:(3.45*10+0.5)取整,再除以10

    /// <summary>
    /// 计算四舍五入
    /// </summary>
    /// <param name="value">值</param>
    /// <param name="decimals">截取位数</param>
    /// <returns></returns>
    public static double Round(double value, int decimals)
    {
        if (value < 0)
        {
            return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);
        }
        else
        {
            return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
        }
    }

     

     
  • 相关阅读:
    作为一个非计算机专业的人,你们是怎样进入IT行业的?
    第一次写博客
    变卖
    近2周关于Shadowing的总结
    二十九岁步入而立之年的思考
    最美的回忆漫天的雪
    有趣的房东夫妇
    遥远的思恋—我的儿子
    五年一轮回
    写在开工之前我的2010
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2211215.html
Copyright © 2011-2022 走看看