• C# Math.Round()四舍五入、四舍六入五成双


    开发者为了实现小数点后 2 位的四舍五入,编写了如下代码,

    var num = Math.Round(12.125, 2);
    代码非常的简单,开发者实际得到的结果是12.12, 这与其所预期的四舍五入结果12.13相悖。

    其实产生这个结果的原因是由于Math.Round 默认使用的并非是四舍五入的原则,而是四舍六入五成双的原则。

    四舍六入五成双
    所谓的四舍六入五成双,就是说当确定有效位数之后,有效位数的下一位如果小于等于4就舍去,如果大于等于6就进一,当有效位数的下一位是5的时候

    如果5前为奇数,就舍五进一
    如果5前为偶数,就舍五不进(0是偶数)
    统计学上将,四舍六入五成双比四舍五入要更精确,因为大量计算的情况下,四舍五入逢五进一,会导致结果偏向大数。

    例如:

    1.15+1.25+1.35+1.45 = 5.2
    
    • 1

    如果有效位数是小数点后一位,使用四舍五入原则得到的结果

    1.2 + 1.3 + 1.4 + 1.5 = 5.4
    
    • 1

    而使用四舍六入五成双原则得到的结果是

    1.2 + 1.2 + 1.4 + 1.4 = 5.2
    
    • 1

    由此可见四舍六入五成双原则得到的结果更为精确。

    Math.Round的四舍五入
    那么如何使用Math.Round实现预期的四舍五入呢?

    其实C#中的Math.Round提供了非常多的重载方法,其中有两个重载方法是,

    public static double Round (double value, int digits, MidpointRounding mode);
    public static decimal Round (decimal d, int decimals, MidpointRounding mode);
    
    • 1
    • 2

    这两个方法都提供了第三个参数mode, mode是一个MidpointRounding的枚举变量,它有2个可选值

    AwayFromZero - 四舍五入
    ToEven - 四舍六入五成双
    所以如果我们希望的到一个理想中四舍五入的结果,,我们可以改用如下代码:

    var num = Math.Round(12.125, 2, MidpointRounding.AwayFromZero);
    
    • 1
  • 相关阅读:
    Redis之五大基础数据结构深入、应用场景
    网络数据帧中的(Jumbo Frame)巨帧、超长帧
    XXE 漏洞及案例实战
    Could not run ‘aten::slow_conv3d_forward‘ with arguments from the ‘CUDA‘ bac
    SpringCloud-消息组件
    大数据Flink(一百零一):SQL 表值函数(Table Function)
    C++:STL--List
    Linux驱动框架及详述(详细教程)
    idea使用gradle教程 (idea gradle springboot)2024
    写好技术书籍
  • 原文地址:https://blog.csdn.net/weixin_44031654/article/details/132880552