1. ホーム
  2. .net

[解決済み】なぜ.NETはデフォルトで銀行員の丸めを使用するのですか?

2022-03-31 19:22:15

質問

ドキュメントによると 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になってしまった。

解決方法は?

おそらく、このアルゴリズムの方が優れているからでしょう。 何度も丸めを行ううちに、すべての0.5が上にも下にも同じように丸められるように平均化されるでしょう。 これにより、例えば丸められた数字をたくさん足す場合、実際の結果をよりよく見積もることができます。 これは、ある人が期待するものとは違うかもしれませんが、おそらく、より正しいことだと言えるでしょう。