仕様書に、
消費税額は 1 円未満を切り捨てる。
と記述されていた場合、
10.5 → 10.0
となるのは、誰もが正しいと答えるでしょう。
では、マイナス値だった場合、
(a) -10.5 → -10.0
(b) -10.5 → -11.0
のどちらを仕様作成者は意図しているのでしょう?
Microsoft Excel の切り捨て関数は
FLOOR 関数なのですが、FLOOR 関数ですと
(a) の
-10.0 になります。
つまり、切り捨てとは「
ゼロに近い方へ丸める」と定義していることになります。
一方、
Java や
VB.net,
C# 等の
floor 関数は、
(b) の
-11.0 になります。
関数仕様では、
引数の値「以下」で最大の整数 と定義されています。
単純に表現すれば、「
小さい方へ丸める」ということです。
では、データベースの
ORACLE 等では、切り捨て関数というと
trunc になるのですが、
(a) の
-10.0 になります。
これは、切り捨てとは「
その桁以下の数値をゼロにする」と定義しているからです。
どれが正しいかというのは、実は
ナンセンスな議論になります。
なぜなら、何れも
定義の問題だからです。
さて、ここで最初の質問に戻ります。
「消費税額は切り捨てる」と仕様書に記述した作成者の意図はどうなのでしょう?
正解は「
わからない!」です。
作成者が仕様書に
定義していない以上、作成者以外にわかる人はいないはずです。
しかし、ほとんどのプログラマは、作成者に確認することなく、自分自身の解釈(定義)でプログラミングすることでしょう。
作成者の意図が、その解釈とは異なっていたとしても、テストでもスルーしてしまい、結果的に本番リリース後に発覚するということが多々ある事例です。
悪いことに、SE 自身も自分自身の解釈(定義)で仕様書を作成していることすらあります。
エンドユーザーの担当者が「消費税額は切り捨てる」と言ったので、そのまま記述してしまったということです。
私の経験ではユーザー部門の多くは、切り捨てというとデータベースの
trunc 的な「
その桁以下の数値をゼロにする」と解釈していることが多いようです。
ということで、SE の皆さん、「切り上げ」や「切り捨て」については、
仕様書に正負の数値を例示する!
ということを心がけるようにしましょう!
そうすれば、仕様書のレビューの段階でユーザー部門に対しても確認することができます。
Copyright © 2004-2009 System House ACT. All Rights Reserved.
(Comments and Trackbacks each author is also exist Copyright.)