スポンサーリンク

銀行丸めと四捨五入。いやだからC#でも四捨五入は出来るから

銀行丸めと四捨五入。 | みむらの手記手帳.

どうもこう言うのには過剰に反応してしまいます。

銀行丸めってまだ言うのかってのはさておき、一応浮動小数点のスタンダードであるIEEE 754では桁丸めの方法をいくつか定義していて、このうち銀行丸めあるいは偶数丸めといわれるものが、最近接丸め(偶数)、四捨五入と言われているものが最近接丸め(0から遠い方へ)に相当します。

まぁ、どっちにしてもIEEE通りであるので違反にはなりませんが、偶数丸めにした方が結果誤差が少なくなるとされ、偶数丸めが選択される方が電算機の環境としては多いのでは無いかと思います。

C#というか、.NET FrameworkのSingle/Double型のデータをRoundメソッドで桁丸めする場合のデフォルトの動きは最近接丸め(偶数)となりますが、以下のようにオプションを付けることで最近接丸め(0から遠い方へ)を選択することも出来ます。他の方法が選択できない環境と比べるとすばらしいですね、

using System;

namespace Marume
{
    class Program
    {
        static void Main(string[] args) {
            var a = 4.5;
            Console.WriteLine("偶数丸め: {0}", Math.Round(a, 0));
            Console.WriteLine("四捨五入: {0}", Math.Round(a, 0, MidpointRounding.AwayFromZero));
            /*
             結果:
             偶数丸め: 4
             四捨五入: 5
             */
        }
    }
}

引数として渡すenumがそのまま過ぎです。

ちなみにC99から追加されたround関数は最近接丸め(偶数)が仕様なので、元記事書かれた方がどういう環境で試験したのかは気になります。(それまでC標準としてはround関数が無い。)

ということで、桁丸めは職務的に嫌ってぐらいあれこれやっているので、C#は四捨五入じゃ無いって書かれてもなぁとの思いで脊椎反射しました。後悔はしていない。

#しかし、Rubyで偶数丸めにしたいときとかみんな無いのって言うか、どうしてるのって言う。。
#Excelとかについてはこちらを見て下さい。
#ああ、あと、Excelのセル関数の方のROUNDは四捨五入なんだけど、フォーマットで桁丸めした場合は偶数丸めになるのでよい子は注意しようね!

追記(10:33):

ちゃんと元記事でも言及されていた。すいません。

自重します。

コメント

タイトルとURLをコピーしました