
■ COBOLの端数計算
諸般の事情で、COBOLでちょっと複雑な数値計算をしている処理を追っていたのですが、何か違和感を感じます。仕様上では切捨てになっている場所で、特に必要な端数処理をしている形跡がないのです。
うーん、COBOLの端数計算ってどうやるんだっけ?
■ 切捨て
WORKING-STORAGE SECTION での定義はこんな感じ。
01 WK-AMSLS PIC S9(12).
01 WK-RND PIC S9(12)V9(2).
PROCEDURE DIVISION で整数部しか指定の無いWK-AMSLSに、小数点以下が発生するような計算結果を突っ込みます。
COMPUTE WK-AMSLS = WK-RND * 8 / (100 + 8).
こうすると、WK-AMSLSには小数点以下が切捨てられて格納されます。
■ 標準桁よせ規則
この辺りの動作ですが、マニュアル(COBOL文法書)に書いている標準桁よせ規則って辺りに書いていました。そのまま書くとアレなので要約しますが、受取側(上の例ではWK-AMSLS)で定義した範囲に収まるように切り捨てるそうです。
今回は S9(12). だったので小数点第一位で四捨五入されたのですが、これが S9(12)V9(1). だった場合は、小数点第二位で切捨てられるって事らしいですね。
■ 端数計算
では、実際に端数計算を行うロジックを書いてみました。
*> 切捨て
COMPUTE WK-AMSLS = WK-RND * 1.
*> 四捨五入
COMPUTE WK-AMSLS ROUNDED = WK-RND * 1.
*> 切上げ
COMPUTE WK-AMSLS ROUNDED = WK-RND + 0.4.
切捨ては何もしない、四捨五入はROUNDED指定、切上げはROUNDED指定に加えて0.4を足す。最近の言語しか知らない人だと、0.4を足して四捨五入ってロジックに驚くかも知れませんね。
まぁそれ以上に、端数計算する桁を指定出来ない事に驚きそうですが。
■ 後書き
そもそも、何でプログラムを追うことになったかっていうと消費税の内税計算に対応する必要が出たからです。
勤め先のシステムは、かなり複雑な端数計算処理が出来るのですが(仕入先別に消費税率の端数処理を変更できるとか)、売上側の内税計算が想定されておらず新たに機能追加する事になったのです。
金額計算の共通処理を弄るので、ちょっと怖いです。
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end —
スポンサードリンク


