なぜ、この知識が重要なのか
COBOLで数値計算を行う際、割り算の結果(商)と余り(剰余)を同時に求めたい場面はよくあります。しかし、安易に「四捨五入」のオプションを付けてしまうと、計算結果に予期せぬズレが生じることがあります。これは、基幹システムのような正確性が求められる世界では致命的なバグにつながりかねません。今回は、データ操作において非常に重要な「REMAINDER句の正しい作法」について解説します。
基礎知識:REMAINDER句とは
COBOLの DIVIDE文 は、単に割り算をするだけでなく、商と余りを分けて格納することができます。
構文は「DIVIDE 割られる数 INTO 割る数 GIVING 商 REMAINDER 余り」という形式です。
ここで重要なのは、数学における剰余の定義です。剰余とは「割られる数 -(商 × 割る数)」で算出される値です。もし商を四捨五入して丸めてしまうと、この計算式が成立しなくなり、データの一貫性が失われてしまうのです。
実装の解決策:ROUNDEDを使ってはいけない
結論から申し上げますと、REMAINDER句を使用するDIVIDE文では、ROUNDED(四捨五入)句を併用してはいけません。
コンパイラによってはエラーや警告が出ますが、中にはそのまま通ってしまうものもあり、後からデバッグで頭を抱える原因になります。「余りを求める計算では、商は必ず切り捨て(整数部のみ)でなければならない」という数学的なルールを、コードを書く際に必ず意識してください。
サンプルプログラム
以下のコードは、100を3で割った際の商と余りを求める基本的な例です。コピーして動作確認に活用してください。
PROGRAM-ID. DIV-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-A PIC 9(03) VALUE 100.
01 VAL-B PIC 9(03) VALUE 003.
01 VAL-QUOTIENT PIC 9(03). > 商
01 VAL-REMAIN PIC 9(03). > 余り
PROCEDURE DIVISION.
> 100 ÷ 3 を計算する
> 注意:ROUNDEDは決して付けないこと
DIVIDE VAL-A BY VAL-B GIVING VAL-QUOTIENT
REMAINDER VAL-REMAIN.
DISPLAY “商: ” VAL-QUOTIENT
DISPLAY “余り: ” VAL-REMAIN
GOBACK.
応用・注意点:現場で役立つポイント
実務では、浮動小数点数(COMP-1やCOMP-2)を計算対象にする場合もありますが、REMAINDER句は基本的に固定小数点数(PACKED-DECIMALやBINARY)で使用することを強く推奨します。
また、もし「商を四捨五入したい」かつ「余りも必要」という複雑な要件がある場合は、DIVIDE文一つで解決しようとせず、以下の手順で実装するのが安全です。
1. まず商を四捨五入して別の変数に退避する。
2. その変数を使って「割られる数 – (商 割る数)」を自分で計算する。
少し手間ですが、これが最もバグを生みにくい「堅牢なプログラム」を作るコツです。計算結果を鵜呑みにせず、常に論理的な整合性を確認する癖をつけましょう。

コメント