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を選択すべきです。設計書に「切り捨て」とだけ書かれている場合は、負数が入力された時の期待値を必ず担当者へ確認してください。この一手間が、システム保守の工数を大きく削減します。

コメント