はじめに
これは設計時の見落とし Advent Calendar 2018の9日目の記事となります。
業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。
切り上げ
仕様書の中に、「小数点第4位で切り上げ」というのがありました。
容積の求める項目なのですが、小数点3桁までとなっている。
容積 =(たて / 1000)×(よこ / 1000)x(たかさ / 1000)
製造作業も終了し、検証作業ということで検証者がチェックしたわけですが、不具合ということで、容積の計算結果が挙がってきたわけです。
下記の計算を行ったとき
(9999 / 1000)×(9999 / 1000)×(9999 / 1000)= 999.70003
製造者の計算結果は、999.701
検証者の計算結果は、999.700
小数点第4位で切り上げであるため、小数点第4位の値は0であるから結果の末桁は、0ではないのか?という認識ですね。
それではと、Excel上の切り上げ関数のROUNDUPで実行してみました。
ROUNDUP(999.70003,3)=999.701という結果となったわけです。
この件は、お客さんに確認して小数点第4位以降を切り上げでいうことで「999.701」で問題ないとなりました。
端数処理もちりもつもれば、集計結果が違ってきてしまいますからね。
端数処理の違いで有名なのは四捨五入で、銀行型丸め、通常の四捨五入があります。
.NET TIPS 数値を四捨五入するには?
端数処理は意外と盲点なので、気をつけた方がいいでしょう。
按分処理後の端数補正
業務用アプリケーションでは、料金などを比率によって振り分ける按分処理を行うことがあります。
簡単な例で言えば、100円を5つに均等配分するとすれば、各20円となります。
では、100円を3つに均等配分してみるとどうでしょう?
この場合、各33円となって、1円が余ってしまいますね。では、この1円はどうするのでしょうか?
この例とは違いますが、以前あった振り分け先として
- 按分した際に金額(按分比率)が一番多いところ、または一番少ないところ
- キーとなるコードの昇順または降順の先頭
- 先に登録された順
これは、ユーザーであるお客さんの決められたルールによって処理します。
逆にこれが決まってないようなら、ユーザーに決めてもらう必要があります。
こうしてユーザーのルールによって、どこかに1円を含めた結果として34円、33円、33円といった配分となるわけです。
60年代末に銀行員の犯行
この端数処理の振り分けで思い出したのが、サラミ法を使った犯罪です。
有名なのは1960年代にアメリカンの銀行で発覚した顧客の預金利子を計算するプログラムで端数処理を四捨五入ではなくすべて切り捨て計算とし、剰余の利息を自分名義の口座に自動振込するプログラムも付け加えて巨額の不正入金を得たというもの。
サラミ法といえばこの事件が有名ですね。実に巧妙な手口です。
塵も積もれば、金額も巨額になるわけですね。
さすがに銀行でこの手口はもう出来ないでしょうけど、最近は何かとポイント制だったりしますので、知らない間に仕組まれている可能性も・・・