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);
        }
    }

     

     
  • 相关阅读:
    李连杰开始做慈善事业了!
    世界是平的,这本书主要是写给美国人看的
    [问题征解]请解释下ubuntu 510 firefox的flash不发音的问题
    中医治疗慢性病很有效
    清理downloader病毒几百个,2个小时
    firefox2.0的拖放式搜索怎么不行了?是设置问题吗?
    spring live上有个入门的整合SSH的例子
    cctv的健康之路节目知识性和可看性都不错!
    跟你分享一下养生的经验
    cctv: 西医拒绝治疗的小孩,中医三天见效
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2211215.html
Copyright © 2011-2022 走看看