gpt4 book ai didi

.net - 为什么.NET 默认使用银行四舍五入?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:15 29 4
gpt4 key购买 nike

根据文档,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;
}

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

框架中是否内置了round-half-up算法的实现?或者可能是一些非托管的 Windows API?

对于初学者来说,简单地编写 decimal.Round(2.5m, 0) 期望结果为 3 但实际得到的是 2 可能会产生误导。

最佳答案

关于为什么银行家算法(又名 round half to even)是一个不错的选择的其他答案是非常正确的。它不像 round half away from zero 那样受到负面或正面偏见的影响。最合理分布的方法。

但问题是为什么 .NET 使用 Banker 的实际舍入作为默认值 - 答案是 Microsoft 遵循了 IEEE 754标准。 MSDN for Math.Round中也提到了这一点在备注下。

另请注意,.NET 通过提供 MidpointRounding 枚举支持 IEEE 指定的替代方法。他们当然可以提供 more alternatives解决关系,但他们选择只满足 IEEE 标准。

关于.net - 为什么.NET 默认使用银行四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916473/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com