業務系アプリの改修・開発をやっていると、常にぶち当たるのが「端数処理の丸め問題」。
この件で最近やらかしたので、まとめておこうと思います。
「最近接偶数への丸め」とは
端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。
やらかした経緯
その案件はKINTONEを使っての業務アプリの改修でした。
お客さんに、
「ここの処理の端数は四捨五入で処理してください」
と頼まれたんです。
とりあえず検証環境にて動作確認です。
計算式型フィールドで処理していた箇所について、丸め処理を変更したい場合には、
「設定」→「高度な設定」から設定変更出来るのですが、
設定できるのは以下の3項目でした。
端数処理について「切り上げ」「切り捨て」「四捨五入」しか知らない私は、
「多分『最近接偶数への丸め』は『四捨五入』のことを指しているんだろう」
と思い、『最近接偶数への丸め』に設定。
そのとき、不思議なことが起こった…
表示する桁数は小数第二位までとしていたのですが、
「0.075」は「0.08」と変換され、
「0.025」は「0.02」と変換されたのです。
これは、絶対におかしい…
何かが、あったに…違いない…
一体、何が…
「最近接偶数への丸め」とは(再掲)
端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。
余談
やらかした一件に関しては、お客様に状況を説明し、
切り上げ処理に変更頂きました。(数値的にx.xx5の運用しか無い想定)
というか、なぜKINTONEのデフォルト設定として四捨五入が存在しないのか……
丸め処理に関しては、
他にも色々と種類があるようです。
「五捨六入」はまだわかるよ。
なんだよ「四捨六入」って。なんだよ「フォン・ノイマン丸め」って。
詳細はwikipedia見てください。
私は本件ですっかり消耗してしまいました。
こうした知識はどういう時に身につくものなんでしょうね。
基本情報処理とかでやったのであれば、少しは覚えているハズなんですが……