カテゴリ: COBOL 更新日: 2025/11/13

COBOLの数値演算で桁あふれを防ぐ!初心者でもわかるサイズエラー対策

数値演算時の桁あふれ対策とサイズエラー回避策
数値演算時の桁あふれ対策とサイズエラー回避策

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLで数の計算をするときに“桁あふれ”って起きることがあるんですか?」

先生

「はい、起きます。たとえば、変数のサイズより大きな数を計算すると、エラーや正しくない結果になることがあるんです。」

生徒

「それって危険ですね……。どうやって防げばいいんでしょうか?」

先生

「いい質問ですね。今日は、COBOLで数値演算をするときに気をつける“桁あふれ(オーバーフロー)”と“サイズエラー”の回避方法を学びましょう。」

1. 桁あふれ(オーバーフロー)とは?

1. 桁あふれ(オーバーフロー)とは?
1. 桁あふれ(オーバーフロー)とは?

桁あふれ(けたあふれ)とは、計算結果が変数のサイズを超えてしまうことです。たとえば、99までしか入らない変数に100を入れようとした場合に起こります。

COBOLでは、変数の大きさはPIC(ピクチャ)句で決まります。たとえば、次のように定義します。


01  TOTAL-AMOUNT  PIC 9(2) VALUE 99.

この場合、TOTAL-AMOUNTは2桁までの数字しか入れられません。もし100を代入しようとすると、値が入りきらず桁あふれになります。

2. SIZE ERRORとは?

2. SIZE ERRORとは?
2. SIZE ERRORとは?

SIZE ERRORとは、COBOLで演算をした結果が変数の定義サイズを超えたときに発生するエラーです。これは、コンピュータが「値が大きすぎて入らない!」という状態を検出したことを意味します。

たとえば、次のような例を見てみましょう。


IDENTIFICATION DIVISION.
PROGRAM-ID. SIZE-ERROR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  NUM-A  PIC 9(2) VALUE 50.
01  NUM-B  PIC 9(2) VALUE 60.
01  RESULT PIC 9(2).
PROCEDURE DIVISION.
    ADD NUM-A TO NUM-B GIVING RESULT
        ON SIZE ERROR
            DISPLAY "サイズエラー発生!計算結果が大きすぎます。"
        NOT ON SIZE ERROR
            DISPLAY "計算結果:" RESULT
    END-ADD.
    STOP RUN.

    サイズエラー発生!計算結果が大きすぎます。

この例では、50+60=110ですが、結果を入れるRESULTは2桁しかないため、SIZE ERRORが発生します。

ON SIZE ERROR句を使うことで、桁あふれが起きたときの処理を安全に制御できます。

3. 桁あふれを防ぐ3つのポイント

3. 桁あふれを防ぐ3つのポイント
3. 桁あふれを防ぐ3つのポイント

桁あふれを防ぐには、COBOLのデータ定義と演算方法に注意が必要です。ここでは3つの具体的な対策を紹介します。

① PIC句の桁数を余裕を持って設定する

計算で大きな数になる可能性がある場合は、変数の桁数を多めに設定しておきましょう。たとえば、2桁の数字を足し算するなら、結果を入れる変数は3桁にしておくと安全です。


01  NUM-A  PIC 9(2) VALUE 50.
01  NUM-B  PIC 9(2) VALUE 60.
01  RESULT PIC 9(3).

このように定義すると、50+60=110が問題なく入ります。システム開発では、将来的に数値が増える可能性を考えて、少し多めに桁を確保するのが一般的です。

② ON SIZE ERROR句で安全な処理を行う

演算命令(ADDSUBTRACTMULTIPLYDIVIDEなど)には、ON SIZE ERRORをつけることで、エラー発生時の処理を明示的に書けます。

これにより、計算が失敗してもプログラムが止まることなく、安全にエラーメッセージを表示したり、代替の処理を実行したりできます。

③ NOT ON SIZE ERROR句を併用する

NOT ON SIZE ERRORを使えば、正常に計算できた場合の処理も明確に分けられます。これにより、エラーの有無に関係なく、正確な動作が保証されます。

4. さまざまな演算でのサイズエラー例

4. さまざまな演算でのサイズエラー例
4. さまざまな演算でのサイズエラー例

COBOLでは、加算(ADD)だけでなく、引き算(SUBTRACT)、掛け算(MULTIPLY)、割り算(DIVIDE)でもサイズエラーが起こります。ここではそれぞれの例を紹介します。

● SUBTRACT(引き算)での例


SUBTRACT 200 FROM 50 GIVING RESULT
    ON SIZE ERROR DISPLAY "サイズエラー:結果がマイナスになりました。".

この場合、結果は「-150」になりますが、もしRESULTPIC 9(3)(符号なし)だとマイナスを扱えないため、サイズエラーになります。

● MULTIPLY(掛け算)での例


MULTIPLY 99 BY 99 GIVING RESULT
    ON SIZE ERROR DISPLAY "サイズエラー:掛け算の結果が大きすぎます。".

結果は9801になります。もしRESULTPIC 9(3)だと4桁の数値を格納できず、サイズエラーになります。

● DIVIDE(割り算)での例


DIVIDE 100 BY 0 GIVING RESULT
    ON SIZE ERROR DISPLAY "ゼロで割り算はできません!".

割り算で「0」で割るとエラーになります。COBOLはこのような危険な計算もON SIZE ERRORで防ぐことができます。

5. 実務で使える安全な数値演算の書き方

5. 実務で使える安全な数値演算の書き方
5. 実務で使える安全な数値演算の書き方

実際の業務システムでは、金額や数量などの数値を扱うとき、桁あふれを防ぐ工夫が欠かせません。以下は、安全な書き方の例です。


IDENTIFICATION DIVISION.
PROGRAM-ID. SAFE-MATH.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  PRICE       PIC 9(6)V99 VALUE 999999.99.
01  TAX-RATE    PIC 9V99    VALUE 1.10.
01  TOTAL       PIC 9(7)V99 VALUE 0.
PROCEDURE DIVISION.
    MULTIPLY PRICE BY TAX-RATE GIVING TOTAL
        ON SIZE ERROR
            DISPLAY "サイズエラー:金額が大きすぎます。"
        NOT ON SIZE ERROR
            DISPLAY "税込金額:" TOTAL
    END-MULTIPLY.
    STOP RUN.

    税込金額:1099999.89

ここではVが小数点を表しています。桁数と小数点位置をしっかり設定することで、金額計算でも安全に処理できます。

また、ON SIZE ERRORを必ず書いておくことで、想定外の入力や桁あふれが起きたときにも安心です。

6. まとめ:エラーを恐れず安全に計算しよう

6. まとめ:エラーを恐れず安全に計算しよう
6. まとめ:エラーを恐れず安全に計算しよう

COBOLの数値演算では、「桁あふれ」と「サイズエラー」は避けられないテーマです。しかし、正しいデータ定義とON SIZE ERRORの活用で、トラブルを事前に防げます。

プログラミング初心者の方も、まずは「変数のサイズを大きめに」「サイズエラー処理を必ず書く」ことを意識しましょう。これだけで、より安全で信頼性の高いCOBOLプログラムを書くことができます。

カテゴリの一覧へ
新着記事
New1
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New2
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New3
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
New4
COBOL
COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.3
Java&Spring記事人気No3
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.4
Java&Spring記事人気No4
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法