導入
業務系システムにおいて、金額計算や月次バッチ処理で避けて通れないのが「剰余(余り)」の計算です。しかし、言語仕様やプラットフォームの癖に依存した計算ロジックを実装してしまうと、保守や移行の際に「端数処理の計算結果が微妙に合わない」という致命的なバグを引き起こすことがあります。これを防ぐために活用すべきなのが、COBOLの組込関数であるREM関数とMOD関数です。今回は、なぜこれらを使うべきなのか、その重要性と実装の勘所を解説します。
基礎知識
COBOLにおけるREM関数とMOD関数は、どちらも剰余を求めるものですが、計算結果に明確な違いがあります。
REM関数は「被除数 – 除数 整数部(被除数 / 除数)」として定義され、除数と被除数の符号が異なる場合に演算結果の符号が被除数に依存します。
一方、MOD関数は「被除数 – 除数 整数部(被除数 / 除数)」の数学的な定義に忠実であり、結果の符号は常に除数と一致します。
会計計算において「端数」を扱う際、どちらの定義を採用するかはシステム設計の根幹に関わります。標準関数を使うことで、プラットフォームに依存しない「計算の揺らぎ」を排除できるのが最大のメリットです。
実装/解決策
実務では、単に余りを求めるだけでなく、計算結果の符号をどう扱うかを意識する必要があります。特に金額の正負が混在する明細データでは、独自に演算ロジックを書かず、必ず組込関数を通すようにしてください。これにより、将来的な環境移行やマイグレーションの際、計算ロジックの不整合というリスクを最小化できます。
サンプルプログラム
以下は、REM関数とMOD関数の挙動の違いを確認し、実務で安全に計算を行うためのサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. REM-MOD-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC S9(5) VALUE 10.
01 NUM-B PIC S9(5) VALUE -3.
01 RESULT-REM PIC S9(5).
01 RESULT-MOD PIC S9(5).
PROCEDURE DIVISION.
> REM関数: 被除数(10)の符号が優先される
COMPUTE RESULT-REM = FUNCTION REM(NUM-A, NUM-B)
DISPLAY “REMの結果: ” RESULT-REM.
> MOD関数: 除数(-3)の符号が優先される
COMPUTE RESULT-MOD = FUNCTION MOD(NUM-A, NUM-B)
DISPLAY “MODの結果: ” RESULT-MOD.
GOBACK.
応用・注意点
現場で最も陥りやすい罠は、負の数に対する剰余処理です。特に「切り捨て」や「四捨五入」と組み合わせる際、REMとMODのどちらが適切かを仕様書で明確にしておく必要があります。また、除数がゼロになるケースは例外(プログラム異常終了)となるため、必ず除数がゼロでないことを事前にチェックするロジックを挟むのが、ベテラン技術者の鉄則です。計算の互換性を担保し、堅牢なシステムを構築してください。

コメント