「銀行家の丸め」とは何か

「銀行家の丸め」というコトバがあります。このコトバ、知らなかったでしょ?知ってる人って少ないと思うんですよ。このブログは会計初学者のSEさん向けに書いてるわけですけど、この「銀行家の丸め」はかなり細かい話なんで、初学者の人はまず知らないはず。でも知ってしまえばものすごく簡単なハナシなので、これを機会に覚えちゃって下さい。

なお、この「銀行家の丸め」は、「最近接偶数への丸め」「偶数丸め」「JIS丸め」「ISO丸め」「五捨五入」「偶捨奇入」「bankers’ rounding(バンカーズラウンディング)」とも呼ばれます。何しろマイナーな処理なので言い方も定まってないんだよね、たぶん。

目次

四捨五入の一種

この「銀行家の丸め」ってのは、四捨五入の一種です。「ちょっと変わった四捨五入」って言えばいいかな。

定義

定義は、「端数が0.5より小さいなら切り捨て、端数が0.5より大きいならば切り上げる。端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。」というもの。

説明!

文章で書くとちょいとわかりづらいですね。でも、処理の大部分は四捨五入と同じです。「端数が0.5より小さいなら切り捨て、端数が0.5より大きいならば切り上げる。」の部分は、まさに四捨五入ですよね。

いわゆる普通の四捨五入と違うのは、端数がちょうどピッタリ0.5だった時です。端数がちょうどピッタリ0.5だった時は、切り捨てと切り上げのうち結果が偶数となる方へ丸めるんです。

ちょっとピンと来ないですかね。表を書いてみましょう。こんな感じです。

元になる数 普通の四捨五入 銀行家の丸め
0.5 1 0
1.5 2 2
2.5 3 2
3.5 4 4
4.5 5 4
5.5 6 6
6.5 7 6

元になる数が1.5、3.5、5.5の時はそれぞれ2、4、6で結果は一緒ですね。しかし、0.5、2.5,4.5、6.5の結果は違っています。なんか変な感じがすると思いますが、こーいう定義なので慣れるしかありません。

なんでこんなことすんの?

で、なんでこんなわけわからん処理があるのかというと、処理→丸め→処理→丸め・・・と何度も何度も丸めをした場合に数値の総合計のズレが少なくなるように、という意図が込められているようです。

例えば、さっきの表の一番下に総合計の行を加えてみましょう。

元になる数 普通の四捨五入 銀行家の丸め
  0.5 1 0
  1.5 2 2
  2.5 3 2
  3.5 4 4
  4.5 5 4
  5.5 6 6
  6.5 7 6
総合計 24.5 28 24

元になる数の総合計が24.5であるのに対し、普通の四捨五入をした結果を集計すると28、「銀行家の丸め」をすると24となり、「銀行家の丸め」の方が元になる数の総合計に近いですよね。これが「銀行家の丸め」の威力です。元になる数との差が、普通の四捨五入よりも小さくなるわけです。

最初に書いた通り、「銀行家の丸め」は「JIS丸め」「ISO丸め」とも呼ばれています。その呼び名の通り、JISやISOの規格にも定められた丸めの方法なんです。上記のような威力があるから、好ましい丸め方として取り上げられているわけですね。

a0002_012052

衰退していく運命らしい

しかし、この「銀行家の丸め」は消えていく運命のようです。OracleやMySQLなどのデータベースの最新版では、「四捨五入」をするROUND関数は全て「いわゆる普通の四捨五入」になっているようです。「銀行家の丸め」がいつ頃まで生き残っていたのかと色々と検索してみたのですが、どうも2006年あたりまでのMySQLのROUND関数ではこの「銀行家の丸め」が採用されていたようです。

ここで恐ろしいのは、同じSQLを書いていても、バージョンによって挙動が変わってしまうということですね。こんな簡単に思える関数の挙動がバージョンによって違うというのはかなりのハマリポイント。覚えとくといいかも。

まー考えてみるとよくある話で、昔はHDDも高かったからDBのカラムの桁数を少しでもケチりたかったんだよね。だから、昔はなんとか整数のみで演算したかったんだと思います。でも最近になって安くなって、桁数なんていくらでも!!!ケチケチすんな!!!!!って雰囲気になったからガンガンDECIMALとかを使うようになって、「銀行家の丸め」で正確性を上げる意味が薄くなったんだと思います。

そんなわけで、「銀行家の丸め」は、好ましいはずの処理だけど、多くのSEのハマリポイントとなり嫌われて消え行く運命のようです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください