導入
COBOLでの数値計算、特に計算結果を整数として扱いたい場面で「小数点以下の扱い」に悩んだことはありませんか?単に切り捨てを行いたいのか、それとも数学的な意味での「床関数(floor)」が必要なのか。計算仕様の解釈を誤ると、特に負の数値を取り扱う際に大きなバグを生む原因となります。今回は、標準的な整数化を実現する「INTEGER関数」の正しい使い方と、現場で注意すべきポイントを解説します。
基礎知識
COBOLの組込関数である「INTEGER」は、引数に指定した数値を超えない「最大の整数」を返す関数です。他言語でいう「floor関数」に相当します。
ここで重要なのは、正の数と負の数での挙動です。
・正の数(例: 2.9)の場合:小数点以下が切り捨てられ、「2」となります。
・負の数(例: -2.9)の場合:ここが重要です。単なる切り捨て(-2)ではなく、より小さな整数方向(マイナス無限大方向)に丸められるため、「-3」となります。
この「負の数での挙動の違い」を理解していないと、銀行の利息計算や統計処理などで予期せぬ誤差を生むことになります。
実装/解決策
INTEGER関数は「COMPUTE」文の中で使用するのが一般的です。戻り値は整数として扱われますが、受け皿となるデータ項目は、正しく整数を格納できるPICTURE句(例:S9(9)など)で定義しておく必要があります。
サンプルプログラム
以下のコードは、正の数と負の数それぞれに対してINTEGER関数を適用し、結果を表示する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. INTEGER-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL-POS PIC S9(3)V9(1) VALUE 2.9.
01 WS-VAL-NEG PIC S9(3)V9(1) VALUE -2.9.
01 WS-RESULT-POS PIC S9(4).
01 WS-RESULT-NEG PIC S9(4).
PROCEDURE DIVISION.
> 正の数の変換: 2.9を超えない最大の整数 -> 2
COMPUTE WS-RESULT-POS = FUNCTION INTEGER(WS-VAL-POS).
> 負の数の変換: -2.9を超えない最大の整数 -> -3
COMPUTE WS-RESULT-NEG = FUNCTION INTEGER(WS-VAL-NEG).
DISPLAY “正の数 2.9 のINTEGER結果: ” WS-RESULT-POS.
DISPLAY “負の数 -2.9 のINTEGER結果: ” WS-RESULT-NEG.
STOP RUN.
応用・注意点
現場でよくある失敗は、「単に小数点以下を切り捨てて整数にしたい(0に近い方へ丸めたい)」という要件に対して、安易にINTEGER関数を使ってしまうことです。
もし、負の数であっても「-2.9」を「-2」にしたい(つまり単純な桁落ちを行いたい)場合は、INTEGER関数ではなく、PICTURE句で整数部のみを定義した項目にMOVEするか、TRUNCATEオプション付きの演算を検討してください。
また、INTEGER関数は引数が非常に大きな数値の場合、オーバーフローのリスクがないか受け取り側のデータ項目の桁数を確認することも忘れないでください。ベテランの技としては、計算結果の精度を保証するため、必ずテストデータに「0」「正の小数」「負の小数」を含めて検証することをお勧めします。

コメント