かなめのロジック

フリーSEの雑記ブログ。ORACLEやPostgreSQL、情報セキュリティ、金融について主に書いています。

銀行丸め、ROUNDとの違いに注意

time 2016/01/08

銀行丸め、ROUNDとの違いに注意

ORACLEの端数処理関数について、先日まとめました。その中で、ROUND関数は四捨五入であり、銀行丸めではないと記述しました。
今回の記事では、その銀行丸めについて解説していきたいと思います。

sponsored link

銀行まるめとは

銀行丸めとは、端数が5より小さいなら切捨て、5より大きいならは切上げるというところまでは、通常の四捨五入と同じです。異なっているのは、5の場合の扱いです。通常の四捨五入が切上げるのに対し、銀行丸めは結果が偶数になる方に丸めます。

例をあげると、以下のようになります。

通常の四捨五入だと、4.5は5に丸めます。

銀行員が好んで使っていたことがこの名前の由来のようです。
別名「最近接偶数への丸め」、単に「偶数丸め」と呼ぶこともあります。
また、JIS規格(日本工業規格)では四捨五入よりも銀行丸めを使用する方が望ましいとしています。国が推奨しているのにも関わらず、ほとんど使われているあたりは不思議ですね。学校で習った記憶もないです。四捨五入に比べて分かりにくいのがネックなのかもしれません。

では、銀行丸めはどのような点で利点があるのか、それは端数処理後の値を合計する際の誤差が少ない点にあります。

端数処理をせずに合計した値と比較した場合、通常の四捨五入よりも銀行丸めの方が差が小さいのが分かります。

ORACLEでの銀行丸めサンプル

ORACLEで銀行丸めを行うためのサンプルです。
負数も偶数に丸めています。

SQL内で使用(整数に丸める場合)
(aには対象数値項目を指定してください)

SQL内で使用(整数以外にも丸める汎用版)
(aには対象数値項目を指定、bには桁位置の指定(ROUND関数の指定と同じ)してください)

ファンクション

上記ファンクション使用

参考(使用している関数について)

ROUNDのプログラム言語やDBでの差異

ここまでORACLEの動作を見てきましたが、ROUND関数の動作はプログラム言語やDBによって異なります。
四捨五入:Java・EXCEL関数・PostgreSQL・SQLServer など
銀行丸め:C#・VBA・MYSQL など

EXCEL関数とVBAで動作が異なるのは意外です。注意が必要ですね。

まとめ

通常の四捨五入と銀行丸めは、端数が5の場合の動作が異なることについて、細かく見てきました。
5の端数処理が、ユーザーの要求と一致しているかどうか、注意してみてください。

関連

sponsored link

管理人

かなめ

フリーの業務系システムエンジニア。情報処理安全確保支援士。 ORACLEと金融と子育ての狭間で、元気に楽しくやってます。 [詳細]

管理人twitter

ブログ村



sponsored link