为什么.NET使用银行家的四舍五入作为缺省值?

为什么.NET使用银行家的四舍五入作为缺省值?

根据文档,decimal.Round方法使用的是一种不为大多数应用程序所普遍的四舍五入的算法。因此,我总是编写一个自定义函数来执行更自然的加法算法:

public static decimal RoundHalfUp(this decimal d, int decimals){
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;}

有人知道这个框架设计决策背后的原因吗?

在框架中是否有任何将整半算法内建的实现?或者是一些非托管的WindowsAPI?

对于那些只会写东西的初学者来说,这可能是误导性的。decimal.Round(2.5m, 0)预期结果是3,但却得到2。


阿晨1998
浏览 343回答 3
3回答

扬帆大鱼

可能是因为这是个更好的算法。在许多圆球的过程中,你的平均结果是所有的5.5的结果都是平平的向上和向下的四舍五入。这提供了更好的实际结果的估计,例如,添加一组四舍五入的数字。我想说的是,尽管这不是一些人所期望的那样,但这可能是更正确的做法。

至尊宝的传说

另一个答案是为什么银行家的算法(又名“银行家算法”)第二轮对半平是个不错的选择,都是相当正确的。它没有受到消极或积极的偏见的影响。离零半圆方法对最合理的分布。但是问题是为什么.NET使用Banker的实际四舍五入作为缺省值-答案是Microsoft遵循了IEEE 754标准的。中也提到了这一点。用于Math.圆形的MSDN在评论下。还请注意,.NET通过提供MidpointRounding枚举他们当然可以提供更多的选择解决纽带问题,但他们选择只满足IEEE标准。

MMMHUHU

虽然我不能回答“为什么微软的设计师选择这个作为默认的?”,但我只想指出一个额外的功能是不必要的。Math.Round允许您指定MidpointRounding:当一个数字介于另外两个数之间时,它被四舍五入到最近的偶数。AwayFromZero-当一个数字介于另外两个数之间时,它被四舍五入到远离零的最近数。
打开App,查看更多内容
随时随地看视频慕课网APP