为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2019-06-28 10:41:01
为什么.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。
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-06-28
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

另一个答案是为什么银行家的算法(又名“银行家算法”)第二轮对半平是个不错的选择,都是相当正确的。它没有受到消极或积极的偏见的影响。离零半圆方法对最合理的分布。

但是问题是为什么.NET使用Banker的实际四舍五入作为缺省值-答案是Microsoft遵循了IEEE 754标准的。中也提到了这一点。用于Math.圆形的MSDN在评论下。

还请注意,.NET通过提供MidpointRounding枚举他们当然可以提供更多的选择解决纽带问题,但他们选择只满足IEEE标准。


查看完整回答
反对 回复 2019-06-28
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

虽然我不能回答“为什么微软的设计师选择这个作为默认的?”,但我只想指出一个额外的功能是不必要的。

Math.Round允许您指定MidpointRounding:

  • 当一个数字介于另外两个数之间时,它被四舍五入到最近的偶数。
  • AwayFromZero-当一个数字介于另外两个数之间时,它被四舍五入到远离零的最近数。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 342 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信