文書によると、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;
}
このフレームワーク設計の決定の理由を知っている人はいますか?
フレームワークに、切り上げアルゴリズムの組み込み実装はありますか? あるいは、管理されていない Windows API でしょうか?
decimal.Round(2.5m, 0)
結果として 3 を期待して単に書いたのに、実際には 2 が返されると、初心者にとっては誤解を招く可能性があります。
ベストアンサー1
バンカーアルゴリズム(別名半分を均等に丸める)は良い選択であるというのは全く正しい。それは、ゼロから半分を丸めるほとんどの合理的な分布に対してこの方法を適用します。
しかし、なぜ.NETはBankerの実際の丸めをデフォルトとして使用しているのかという疑問があった。その答えは、MicrosoftがIEEE754 規格標準。これはまた、Math.Round の MSDN備考欄に記載。
また、.NETは列挙体を提供することでIEEEが規定する代替方法をサポートしていることにも注意してくださいMidpointRounding
。もちろん、より多くの選択肢同点の解決を目指して、IEEE 標準を満たすことを選択しました。