【COBOL学習|実務向け】COBOLの「負数」の罠!INTEGER関数とINTEGER-PART関数の決定的な違い

1. 導入:なぜこの違いを知る必要があるのか

COBOLの組込関数である「INTEGER」と「INTEGER-PART」は、一見するとどちらも「整数を返す関数」として混同されがちです。しかし、正の数では同じ挙動を示すこの両者も、「負数」を扱った瞬間にその結果は大きく異なります。この挙動の違いを理解していないと、座標計算やマイナスの会計調整、在庫のマイナス評価などで予期せぬ数値のズレが生じ、致命的なバグを引き起こすリスクがあります。現場のエンジニアとして、この「丸め方向」の特性を正しく把握しておくことは必須です。

2. 基礎知識:関数が向かう先

COBOLにおいて、この二つの関数は以下のような定義に基づいています。

INTEGER関数:引数の値を超えない最大の整数を返します。数学でいう「床関数(floor)」の考え方であり、数直線上で常に左側(マイナス無限大方向)へ移動します。
INTEGER-PART関数:単に小数点以下を切り捨てます。つまり、0方向(絶対値が小さくなる方向)へ移動します。

負数において、INTEGER関数は「より小さい値(-2.1なら-3)」へ、INTEGER-PART関数は「より0に近い値(-2.1なら-2)」へ向かうという点を叩き込んでください。

3. 実装と解決策:計算ロジックの使い分け

負数を含む計算を行う際は、業務要件を再確認してください。「端数を切り捨てる」という要件が「0に近い方へ寄せる」ことを意味するのか、「数直線上の左へ寄せる」ことを意味するのか。もし「単純な切り捨て」を意図しているならINTEGER-PARTを、数学的な床関数としての振る舞いが必要ならINTEGERを使用します。

4. サンプルプログラム

以下のコードを実行し、負数における挙動の違いを確認してください。

IDENTIFICATION DIVISION.
PROGRAM-ID. ROUND-TEST.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-NEG        PIC S9(3)V9 VALUE -2.1.
01 RES-INT        PIC S9(3).
01 RES-PART       PIC S9(3).

PROCEDURE DIVISION.
    > INTEGER関数: -2.1を超えない最大の整数(-3)が返る
    COMPUTE RES-INT = FUNCTION INTEGER(VAL-NEG).
    
    > INTEGER-PART関数: 小数点以下を切り捨て(-2)が返る
    COMPUTE RES-PART = FUNCTION INTEGER-PART(VAL-NEG).

    DISPLAY "元値: " VAL-NEG.
    DISPLAY "INTEGER関数結果: " RES-INT.      > 出力: -3
    DISPLAY "INTEGER-PART関数結果: " RES-PART. > 出力: -2

    GOBACK.

5. 応用・注意点:現場でのバグ回避策

現場で最も怖いのは、「正の数だけでテストを済ませてしまうこと」です。テストデータを作成する際は、必ず「ゼロ」「正の数」「負の数」の3パターンを網羅してください。

特に、金額計算などで「マイナス値の絶対値を維持したまま切り捨てたい」というケースでは、INTEGER-PARTを使用するのが一般的です。逆に、統計処理や物理シミュレーション等で数値の連続性を保ちたい場合はINTEGERを選択すべきです。設計書に「切り捨て」とだけ書かれている場合は、負数が入力された時の期待値を必ず担当者へ確認してください。この一手間が、システム保守の工数を大きく削減します。

コメント

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