導入
COBOLは元々「会計・経理」のための言語です。だからこそ、数値——特にお金の金額を正確に扱うための記号が、PICTURE句に丁寧に用意されています。
説明
数値のPICTURE句で使う主な記号は3つです。
| 記号 | 意味 |
|---|---|
9 | 数字1桁 |
S | 符号あり(先頭に付ける。マイナスを扱えるようにする) |
V | 暗黙の小数点(画面には表示されない、計算上の小数点位置) |
01 WS-QTY PIC 9(3). *> 000〜999の整数
01 WS-BALANCE PIC S9(7)V99. *> 符号付き、整数7桁+小数2桁
01 WS-DIFF PIC S9(5). *> 符号付き整数(マイナスも可)
PIC 9(3)… 符号なしの3桁整数。000〜999。PIC S9(7)V99…Sで符号あり、9(7)で整数部7桁、Vで小数点、99で小数部2桁。つまり「−9999999.99 〜 9999999.99」を表せる金額向けの型。V(暗黙の小数点)が重要なポイントです。Vは画面には表示されず、実際のメモリにも記号として保存されません。あくまで「計算のときに、ここに小数点があるものとして扱う」という位置の約束事です。たとえばPIC S9(3)V99の変数に12345という数字の並びが入っていれば、それは実際には123.45として計算されます。
なぜこんな仕組みなのでしょうか。金額計算で誤差を出さないためです。多くの言語の浮動小数点数(float/double)は、2進数で10進小数を正確に表現できず、0.1 + 0.2 が 0.30000000000000004 になるような誤差が起きます。COBOLの数値は「整数の並び+小数点の位置」という10進数そのものの表現なので、金額計算で誤差が発生しません。これがCOBOLが金融システムで長年信頼されてきた理由の一つです。
試すには
PIC S9(5)V99 の変数に -123.45 という値を入れたとき、実際にメモリ上には符号と数字の並びだけが保持され、小数点そのものは記号として存在しない——という点を頭に置いておいてください。第10章のレッスン49で、実際のメモリ表現をさらに詳しく見ます。