五捨五入 | 悪態のプログラマ

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

「四捨五入」といえば、読んで字のごとく、桁を丸め込むときに端数が4以下なら切り捨て、5以上なら切り上げることである。同様に、「五捨六入」は5以下を切り捨て、6以上を切り上げる。

では、「五捨五入」とは何だろうか(※1)。これは、端数が4以下なら切り捨て、6以上なら切り上げ、5なら結果が偶数になるように切り捨てたり切り上げたりするというものだ。例えば、3.5 を五捨五入して整数に丸めると 4 になるが、2.5 だと 2 になる。つまり、「最も近い偶数に丸める」という計算方法なのである。

この方法は、ISO 31-0:1992 や JIS Z 8401:1999、IEEE 754 で数値を丸める標準的な方法として規定されている(※2)。例えば、VB の丸め込み関数 Round() などは、そのような動きをする。

我々は普段、四捨五入には慣れ親しんでいるが、五捨五入についてはそうでもない。しかし、五捨五入の方が誤差が少ないため、システムの要件としては、好まれることもあるようだ(※3)。


こうした微妙な計算方法の違いが、不幸なバグを生むことは多い。

例えば、四捨五入をするつもりで、「標準」の丸め込み関数を使って、痛い目にあったという話はよく耳にする。

あるいは、仕様書などに「四捨五入せよ」と書いてあったが、実際には五捨五入すべきだった、といったケースもある。

学校で学んできたような一般的なやり方が、どの業界でも一般的(標準的)だとは限らない。そのことを端的に示したよい例かもしれない。




← このブログを誰かに読ませたいと思った方は、クリックを



※1
「銀行型の丸め」と言った方が通りがいいだろうか。他にも、「偶捨奇入」、「偶数への丸め」、「JIS丸め」など、いろいろな呼び方がある。なお、JIS規格に従えば、単に「丸め」と言ったら、五捨五入のことを指すようだ。

※2
こちらのページ によると、JIS規格では、五捨五入が「規則A」、四捨五入が「規則B」として規定されていて、特に明記されていなければ、規則Aを使うこととされているようである。また、「切捨て御注意 」に書いたような、負の数の問題については、「絶対値にしてから適用する」とされているようだ。JIS Z 8401:1999 の原文は、JSA Web Store から PDF を購入することが出来る。

※3
5 は 0 と 10 の中間に位置するのだから、切り上げと切り捨てを平等に行うほうが誤差が少ない。例えば、3.5 + 2.5 は 6.0 だが、四捨五入後に加算すると、4 + 3 = 7 と1大きくなる。五捨六入だと、3 + 2 = 5 で逆に1小さくなる。五捨五入なら 4 + 2 で、ぴったり 6 だ。誤差の問題だけでいえば、奇数に丸めてもいいのだが、0 を基点に考えたほうが分かりやすいから、偶数に丸めるのだろう。



■関連記事
切捨て御注意
ゼロ除算についてあらためて考える
曖昧言葉



■リンク
端数処理(ウィキペディア)
油断ならない四捨五入(「株式会社データアクション」さん)
[.NET] 四捨五入 (「biac の それさえもおそらくは幸せな日々」さん)



Excelで遊ぶ手作り数学シミュレーション
田沼 晴彦
講談社 (2004/01/21)
売り上げランキング: 41,420
おすすめ度の平均: 5
5 エクセルのもう一つの使い方!
5 文系にこそ
5 パソコンに眠っているEXCELを使いこなそう


プログラミングのための線形代数
平岡 和幸 堀 玄
オーム社 (2004/10)
売り上げランキング: 3,237
おすすめ度の平均: 5
5 最高
5 ビジュアル系
5 線形代数の概念を徹底的に解説した本