COBOLのFUNCTION文の使い方を徹底解説!CEILやFLOORなどの便利関数を初心者向けにわかりやすく解説
生徒
「先生、COBOLでも関数みたいなものは使えるんですか?」
先生
「もちろん使えます。COBOLではFUNCTION文というものを使って、計算や文字列処理などを簡単に行うことができます。」
生徒
「えっ!関数ってCOBOLにもあるんですか?他の言語と同じように使えるんですか?」
先生
「はい。ただしCOBOL独自の書き方をします。今日はその中でも特によく使うCEIL(切り上げ)やFLOOR(切り捨て)などを中心に説明しますね。」
1. COBOLのFUNCTION文とは?
COBOLのFUNCTION文(組み込み関数)は、複雑な計算やデータ加工を、短い記述で呼び出せる便利な仕組みです。プログラミングにおいて関数とは、特定の処理をひとまとめにした「道具箱」のようなもので、呼び出すだけであらかじめ決められた計算結果を返してくれます。
従来のCOBOLでは、数値を加工するために複数の行にわたるロジック(論理)を記述する必要がありましたが、FUNCTION文を活用することで、コードが劇的にシンプルになり、プログラムの読みやすさ(可読性)が向上します。これは、現代のシステム開発において保守コストを抑えるために非常に重要な要素です。
ここがポイント!
プログラミング未経験の方でも、COMPUTE 変数 = FUNCTION 関数名(引数)という基本の型さえ覚えれば、すぐに使いこなせます。まずは「自分で計算式を作らなくていいんだ!」と気楽に考えてみてください。
たとえば、ある数値を切り上げたいときにはFUNCTION CEIL、切り捨てたいときにはFUNCTION FLOORといった関数を、計算式(COMPUTE文など)の中に組み込むだけで完了します。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-FUNC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-PRICE PIC 9(4)V9 VALUE 123.4.
01 WS-OUTPUT PIC 9(4).
PROCEDURE DIVISION.
*> 小数点以下を切り捨てて変数に代入
COMPUTE WS-OUTPUT = FUNCTION FLOOR(WS-PRICE)
DISPLAY "元の値: " WS-PRICE
DISPLAY "加工後: " WS-OUTPUT
STOP RUN.
元の値: 123.4
加工後: 0123
このように、関数を使うことで「計算の手順」を意識することなく、「どのような結果が欲しいか」を直感的にプログラミングできるようになります。次章からは、実務で特に多用される具体的な関数を一つずつ詳しく見ていきましょう。
2. FUNCTION CEIL(切り上げ)の使い方
FUNCTION CEILは、引数として与えられた数値の小数点以下を「切り上げ」て、その値以上の最小の整数を返す関数です。例えば、在庫管理システムで「1.1箱必要」という計算結果が出た場合、実際には「2箱」手配する必要がありますよね。そういった「端数が出たら切り上げる」という処理に最適です。
初心者向けのイメージ
CEILは英語で「天井」という意味です。数値が少しでも床(整数)から浮いていたら、上の天井(次の整数)まで持ち上げてくれると覚えましょう。3.1でも3.9でも、天井は「4」になります。
プログラミング未経験の方でも分かりやすいように、簡単なサンプルコードを見てみましょう。ここでは、重さに応じた送料計算などをイメージした数値処理を行っています。
IDENTIFICATION DIVISION.
PROGRAM-ID. CEIL-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
*> 3.2 という小数点を持つ変数を定義
01 WS-WEIGHT PIC 9V9 VALUE 3.2.
*> 結果を格納するための整数変数を定義
01 WS-RESULT PIC 9(3).
PROCEDURE DIVISION.
*> FUNCTION CEIL を使って切り上げを実行
COMPUTE WS-RESULT = FUNCTION CEIL(WS-WEIGHT)
DISPLAY "元の数値: " WS-WEIGHT
DISPLAY "切り上げ後の数値: " WS-RESULT
STOP RUN.
元の数値: 3.2
切り上げ後の数値: 004
このプログラムでは、3.2という値をFUNCTION CEILに渡しています。もしこの関数を使わない場合、「小数点以下があるかどうかを判定し、あれば1を足す」といった複雑なIF文(条件分岐)を書かなければなりませんが、関数一行でミスなく安全に処理を完結できるのが大きなメリットです。
3. FUNCTION FLOOR(切り捨て)の使い方
FUNCTION FLOORは、小数点以下を切り捨てる関数です。たとえば「3.9」を切り捨てると「3」になります。四捨五入ではなく、単純に小数点以下を削除するイメージです。
IDENTIFICATION DIVISION.
PROGRAM-ID. FLOOR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9V9 VALUE 3.9.
01 WS-RESULT PIC 9(3).
PROCEDURE DIVISION.
COMPUTE WS-RESULT = FUNCTION FLOOR(WS-NUM)
DISPLAY "切り捨て結果: " WS-RESULT
STOP RUN.
切り捨て結果: 3
これも実務で非常によく使われます。たとえば「税金の計算」や「端数処理」のようなケースで、金額を切り捨てる場面が多くあります。
4. FUNCTION ROUND(四捨五入)の活用
もう一つ便利なのがFUNCTION ROUNDです。これは数値を四捨五入してくれる関数です。例えば「3.6」は「4」に、「3.4」は「3」になります。
IDENTIFICATION DIVISION.
PROGRAM-ID. ROUND-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9V9 VALUE 3.6.
01 WS-RESULT PIC 9(3).
PROCEDURE DIVISION.
COMPUTE WS-RESULT = FUNCTION ROUND(WS-NUM)
DISPLAY "四捨五入結果: " WS-RESULT
STOP RUN.
四捨五入結果: 4
CEIL、FLOOR、ROUNDを組み合わせることで、どんな端数処理にも柔軟に対応できます。
5. FUNCTION INT(整数部分の抽出)も便利
もう少し応用的なものとしてFUNCTION INTもあります。これは小数点以下を単純に削除して整数部分だけを取り出すものです。切り捨てとは似ていますが、マイナスの数でも常に小数点以下を削除するため、負の値を扱うときに違いが出ます。
IDENTIFICATION DIVISION.
PROGRAM-ID. INT-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC S9V9 VALUE -3.7.
01 WS-RESULT PIC S9(3).
PROCEDURE DIVISION.
COMPUTE WS-RESULT = FUNCTION INT(WS-NUM)
DISPLAY "整数部分の抽出結果: " WS-RESULT
STOP RUN.
整数部分の抽出結果: -3
つまり、FLOORでは-3.7は「-4」になりますが、INTでは「-3」となります。こうした違いを理解して使い分けることが大切です。
6. FUNCTION文を使うとプログラムがスッキリする
もしFUNCTION CEILなどを使わない場合、自分で条件分岐を書いて「もし小数点があれば整数を1増やす」といった処理を書く必要があります。ですがFUNCTIONを使えば、たった一行で済みます。これは保守性(メンテナンスのしやすさ)にもつながり、業務システムを安全に運用する上でも重要な考え方です。
また、CEIL(切り上げ)、FLOOR(切り捨て)、ROUND(四捨五入)、INT(整数化)は、金額計算・在庫管理・時間の丸め処理など、あらゆる業務プログラムで使われています。
7. FUNCTION文を使うときの注意点
COBOLのFUNCTIONは基本的に読み取り専用です。つまり、関数に値を渡しても、変数そのものは書き換わりません。結果は別の変数に代入するようにしましょう。
また、使える関数はCOBOLの処理系によって異なる場合があります。メインフレームCOBOLやオープンCOBOL(GnuCOBOL)などで微妙に動作が異なる場合もあるので、開発環境のマニュアルを確認することが大切です。
まとめ
COBOLのFUNCTION文について学んできた内容を、ここでいったん丁寧に振り返ってみましょう。今回取り上げたCEILやFLOOR、ROUND、INTといった関数は、業務システムの中で非常に多く使われる基本的な機能で、日常的な計算処理を正確かつ簡潔に記述できるようにしてくれます。とくに金額の端数処理や在庫数量の調整、レポート出力時の数値丸めなど、どの現場でも必要になる処理を自然な形で扱えるようになるため、FUNCTION文の理解はCOBOLを扱う上で避けて通れない大切なステップです。 また、FUNCTION文は複雑な計算式を自分で書く必要がなく、すでに用意されている関数を呼び出すだけで正確な結果を得られるところに大きな魅力があります。例えば小数点以下を切り上げる処理を手書きすると、条件分岐や桁数のチェックが必要になり、少しの油断で誤った結果が出てしまうことがあります。ところがFUNCTION CEILを使えば、こうした不安を抱える必要がなくなります。これは保守作業を行う人にとっても大きな安心材料となり、長く運用される業務システムでは特に重要な考え方です。 さらに、切り上げ、切り捨て、四捨五入、整数部分の抽出という四つの代表的な関数が揃っていることで、どのような端数処理にも柔軟に対応できるという点も強みです。CEILであれば必ず大きい方向へ丸め、FLOORであれば小さい方向へ丸め、ROUNDであれば一般的な四捨五入を行い、INTであれば小数点以下を単純に削除します。特にINTは負の値を扱う際にFLOORと結果が異なることがあるため、状況に合わせて使い分けることがとても大切です。この違いを誤って理解していると、マイナスの数量や損益計算を扱うプログラムで予期しない数字が出てしまうこともあるため、今回学んだ内容を活かして慎重に使い分けたいところです。 実務では、こうした端数処理は単に「数値を丸める」だけではなく、金額を集計して総額を算出する場面、時間の区切りを整えてレポートの算出範囲を決める場面、あるいは単価と数量を掛け合わせて合計金額を出す処理など、さまざまな場面に登場します。COBOLのFUNCTION文が持つ安定性と分かりやすさは、こうした作業を安全に行うための基盤となります。特に大量のデータを扱うバッチ処理では、一度の誤差が数万件・数十万件の計算に連鎖する可能性があるため、信頼できる関数を利用した明確な計算ロジックは欠かせません。 そしてFUNCTION文は計算だけでなく、文字列処理や日付操作などにも幅広く活用できます。今回の記事では数値に焦点を当てましたが、COBOLのFUNCTIONには文字列の長さを取得したり、一部だけを取り出したり、日付から年や月を取り出したりなど、多様な関数が存在します。これらを組み合わせることで、業務特有のフォーマットに沿ったデータ変換や編集を自然に行えるようになります。こうした「ひとつひとつの小さな便利さ」が積み重なり、COBOLでの開発と保守がより落ち着いて行えるようになっていきます。 最後に、FUNCTION文はあくまで「値を返すだけの読み取り専用」であるという点にも意識を向けておきましょう。関数を呼び出しても元の変数は書き換わらず、必ず結果を別の変数に代入します。この特性を正しく理解していれば、データが意図せず変わってしまうといった問題を避けることができます。また処理系によって使える関数が違う場合もあるため、環境ごとの仕様を確認しながら実装していく姿勢が大切です。 最後に、今回学んだ内容を踏まえた小さな動作例を示しておきます。数値の丸めと複数の関数の違いを確認する場面を想定した簡単なプログラムです。
サンプルプログラムの再確認
IDENTIFICATION DIVISION.
PROGRAM-ID. FUNC-SUMMARY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9V9 VALUE 7.3.
01 WS-B PIC 9V9 VALUE 7.7.
01 WS-CEIL PIC 9(3).
01 WS-FLOOR PIC 9(3).
01 WS-ROUND PIC 9(3).
01 WS-INT PIC 9(3).
PROCEDURE DIVISION.
COMPUTE WS-CEIL = FUNCTION CEIL(WS-A)
COMPUTE WS-FLOOR = FUNCTION FLOOR(WS-B)
COMPUTE WS-ROUND = FUNCTION ROUND(WS-A)
COMPUTE WS-INT = FUNCTION INT(WS-B)
DISPLAY "切り上げ結果(7.3): " WS-CEIL
DISPLAY "切り捨て結果(7.7): " WS-FLOOR
DISPLAY "四捨五入結果(7.3): " WS-ROUND
DISPLAY "整数化結果(7.7): " WS-INT
STOP RUN.
このプログラムでは同じように見える数値処理でも、それぞれの関数が異なる働きをしていることが確認できます。実際のプログラムでも、どの丸め方法が業務要件に合っているのかをよく検討した上で使い分けることが求められます。
生徒
「先生、FUNCTION文って最初はただの便利なおまけ機能なのかなと思っていましたが、実務ではとても重要なんですね。」
先生
「そうですね。丸め処理は業務システムの随所に出てくるので、正確に使えることはとても大切です。特に金額計算は間違えると大きな影響が出てしまいます。」
生徒
「CEILとFLOOR、ROUND、それからINTの違いもよく分かりました。特にINTがマイナスの値でFLOORと結果が違うのが意外でした。」
先生
「そういう細かいところを理解しておくことで、業務要件に応じた適切な処理を選べるようになりますよ。COBOLは長く使われるプログラムが多いので、こうした基本を丁寧に理解しておくと強みになります。」
生徒
「はい、FUNCTION文の使い方が分かって、COBOLのプログラムがもっと読みやすく感じました!」