1. 導入:なぜROUNDED句が重要なのか
COBOLでの数値計算において、最も注意すべきなのが「端数処理」です。特に金額計算や歩留まり計算など、実務では厳密な数値管理が求められます。COBOLの算術演算(ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTE)において、ROUNDED句を忘れると、デフォルトの動作として「切り捨て」が発生します。この「意図しない切り捨て」は、帳票の合計不一致や、システム間の計算差異を引き起こす重大なバグの温床となります。本稿では、正確な計算結果を得るためのROUNDED句の活用術を解説します。
2. 基礎知識:切り捨てと四捨五入の仕組み
COBOLの算術演算では、受け取り側のPICTURE句(定義)に合わせて結果が格納されます。例えば、計算結果が「12.5」で、受け取り側が「99(整数型)」の場合、ROUNDED句がないと「12」として扱われます。これは「桁落ち」と呼ばれる仕様です。
ROUNDED句を付加すると、受け取り側の最小桁の「次の桁」を評価し、5以上であれば1を加算(四捨五入)します。これにより、実務上の要件である「小数点以下の処理」や「単位未満の調整」を正しく実装できるようになります。
3. 実装と解決策:正確な計算を保証する
実装の鉄則は「計算の最終結果だけでなく、計算過程の端数処理ルールを明確にすること」です。特に複合演算を行う場合、COMPUTE文でROUNDEDをどこに置くかが重要になります。また、受け取り側の変数の定義(桁数)が十分であることも前提条件です。桁数が不足していると、ROUNDED句を使用していてもオーバーフローが発生し、エラーや不正な値の原因となります。
4. サンプルプログラム
以下に、ROUNDED句の有無による計算結果の違いを確認するコード例を記載します。
IDENTIFICATION DIVISION.
PROGRAM-ID. ROUND-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-A PIC S9(3)V9 VALUE 10.5.
01 VAL-B PIC S9(3)V9 VALUE 2.4.
01 RESULT-TRUNC PIC S9(3).
01 RESULT-ROUND PIC S9(3).
PROCEDURE DIVISION.
- 10.5 + 2.4 = 12.9 となる計算で比較します
- ROUNDEDなし:12.9が整数型に格納される際、0.9が切り捨てられる
ADD VAL-A TO VAL-B GIVING RESULT-TRUNC.
DISPLAY “切り捨て結果: ” RESULT-TRUNC.
- ROUNDEDあり:12.9の小数点以下を四捨五入し、13となる
ADD VAL-A TO VAL-B GIVING RESULT-ROUND ROUNDED.
DISPLAY “四捨五入結果: ” RESULT-ROUND.
GOBACK.
5. 応用・注意点:現場で役立つアドバイス
実務で陥りやすい注意点を挙げます。
1. COMPUTE文での位置
COMPUTE RESULT = (A + B) C ROUNDED. と記述した場合、ROUNDEDは「最終的な計算結果」に対してのみ適用されます。計算過程で発生する端数も四捨五入したい場合は、COMPUTEを分けるか、中間項目を定義して個別にROUNDEDを指定してください。
2. 負数の扱い
COBOLのROUNDEDは、絶対値に対して四捨五入を行います。例えば「-1.5」を四捨五入して整数にすると、COBOLの仕様では「-2」になります。数学的な「0に近い方へ丸める」といった特殊な要件が必要な場合は、IF文で判定して加減算するロジックを別途組む必要があります。
3. 桁あふれ(サイズエラー)
ROUNDEDによって繰り上がりが起き、結果が受け取り側のPICTURE句の桁数を超えてしまう場合、ON SIZE ERROR句を併用して異常検知を行うのが堅牢な実装のポイントです。
常に「この計算は切り捨てで良いのか、四捨五入が必要か」を設計書と照らし合わせる癖をつけましょう。

コメント