1. 導入
COBOLは金融システムの中核を担う言語ですが、複雑な複利計算や年金現価係数の算出を自前で実装しようとすると、計算誤差やロジックの肥大化という課題に直面します。特に「毎期の支払額」を求める計算は、精度の高さとメンテナンス性が求められる領域です。COBOLの組込関数であるANNUITY関数を活用すれば、煩雑な数式を記述することなく、標準機能で正確なシミュレーションが可能になります。
2. 基礎知識
ANNUITY関数は、利息と期間(支払い回数)を引数として渡し、元金に対する「毎期の支払額を算出するための係数(年金現価係数)」を返す関数です。
数式で表すと「(1 – (1 + 利率)^(-期間)) / 利率」という計算を行っています。この関数を使うことで、自分でべき乗計算や複雑な除算を実装する際に発生しやすい、浮動小数点誤差を避けることができます。
3. 実装/解決策
ANNUITY関数を使用する際は、利率と期間を引数として指定します。注意点として、返却値は高精度の浮動小数点数(COMP-2)として扱われることが一般的です。そのため、計算結果を格納するデータ項目は、十分な桁数を持つCOMP-2型、あるいは計算後にROUNDED句を用いて適切に丸める必要があります。
4. サンプルプログラム
以下に、ローン返済額を算出する実用的なサンプルコードを記載します。
IDENTIFICATION DIVISION.
PROGRAM-ID. ANNUITY-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- ローン元金
01 WS-LOAN PIC 9(9)V99 VALUE 10000000.
- 年利 (例: 1.2% = 0.012)
01 WS-RATE PIC V9(6) VALUE 0.012.
- 返済回数 (例: 30年 = 360回)
01 WS-PERIOD PIC 9(3) VALUE 360.
- 毎月の返済額
01 WS-PAY PIC 9(8)V99.
PROCEDURE DIVISION.
> ANNUITY関数を使用して毎月の支払額を算出
> 係数(ANNUITY) 元金(LOAN) = 支払額
COMPUTE WS-PAY = WS-LOAN FUNCTION ANNUITY(WS-RATE / 12, WS-PERIOD)
DISPLAY “毎月の返済額: ” WS-PAY
STOP RUN.
5. 応用・注意点
現場での運用において、以下の点に注意してください。
1. 利率の単位に注意:
関数に渡す利率は「1回あたりの利率」です。年利を月払いで計算する場合は、必ず「WS-RATE / 12」のように、期間単位に合わせた利率に変換してください。
2. ゼロ除算の回避:
利率が0%の場合、ANNUITY関数はエラー(または予期せぬ値)を返す可能性があります。利息がない場合は単純に元金を期間で割る計算に切り替えるなど、事前にチェックロジックを組み込むのが安全です。
3. 精度の確保:
金融機関のシステムでは、1円の誤差も許されません。計算結果をDISPLAYする前には、必ずROUNDED句を使用して、端数処理の方針を明確に定義してください。

コメント