【COBOL学習|豆知識】算術演算における「商」の端数切り捨て – COBOL流・事務処理の鉄則

1. 導入:なぜ商の端数処理が重要なのか

COBOLの世界では、計算結果の精度は「業務の信頼性」そのものです。現代の汎用プログラミング言語(JavaやPythonなど)は、浮動小数点演算を行う際に自動で四捨五入や丸めを行うことが一般的ですが、COBOLで同じ感覚でコードを書くと、金融や在庫計算で致命的な誤差を生む可能性があります。COBOLのDIVIDE文における「デフォルトの切り捨て」という仕様は、事務計算において意図しない誤差を防ぐための強力な武器となります。

2. 基礎知識:COBOLの除算とROUNDED句

COBOLのDIVIDE文は、計算結果を格納するデータ項目(PICTURE句)の桁数に合わせて、自動的に演算を行います。ここで重要なのが、ROUNDED句の有無です。
・ROUNDED句なし:計算結果の小数点以下の端数は、切り捨てられます。
・ROUNDED句あり:計算結果の小数点以下の端数は、四捨五入されます。
この挙動を理解し、業務仕様書に記載された「切り捨て」「切り上げ」「四捨五入」の要件に合わせて使い分けることが、ベテランエンジニアの第一歩です。

3. 実装/解決策

例えば、5を3で割る場合、数学的な値は1.666…となります。これを整数型の項目に格納する場合、ROUNDEDを指定しなければ「1」となります。もし、小数点以下を保持したい場合は、受け取り側の変数(GIVINGで指定する項目)のPICTURE句で「9V99」のように小数桁を確保しておく必要があります。切り捨てを行いたい場合は、あえてROUNDEDを指定せず、受け取り側の変数の精度を調整するのが最も安全な実装方法です。

4. サンプルプログラム

以下のコードは、端数切り捨ての挙動を確認するためのサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. DIV-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL1 PIC 9(01) VALUE 5.
01 WS-VAL2 PIC 9(01) VALUE 3.
01 WS-RESULT-INT PIC 9(01).
01 WS-RESULT-DEC PIC 9(01)V99.

PROCEDURE DIVISION.
> 5 ÷ 3 = 1.66… 切り捨てにより 1 となる
DIVIDE WS-VAL1 BY WS-VAL2 GIVING WS-RESULT-INT.
DISPLAY “切り捨て結果(整数): ” WS-RESULT-INT.

> 5 ÷ 3 = 1.66… 小数点以下2桁まで保持
DIVIDE WS-VAL1 BY WS-VAL2 GIVING WS-RESULT-DEC.
DISPLAY “切り捨て結果(小数): ” WS-RESULT-DEC.

STOP RUN.

5. 応用・注意点

現場でよくあるバグは、「受け取り側の変数(GIVING項目)のPICTURE句が足りないことによる桁落ち」です。例えば、結果が100になる計算なのにPICTUREが99だと、上位桁が切り捨てられたり、実行時エラーになる場合があります。また、負の数の計算では「切り捨て(Truncation)」と「ゼロ方向への丸め」の挙動が言語仕様によって異なるケースがあるため、マイナス値が含まれる計算を行う際は、必ず単体テストで符号付きの挙動を確認してください。COBOLの「事務的な正確さ」を最大限活かすためにも、計算前の変数の桁数定義には人一倍気を配るようにしましょう。

コメント

タイトルとURLをコピーしました