本文へスキップ
BecomeCoder

COBOLコース · 第3章 データを表す ― PICTURE句とレベル番号 · レッスン13

数値のPICTURE ― 9・S(符号)・V(暗黙の小数点)

ローカル実施

導入

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桁整数。000999
  • PIC S9(7)V99S で符号あり、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.20.30000000000000004 になるような誤差が起きます。COBOLの数値は「整数の並び+小数点の位置」という10進数そのものの表現なので、金額計算で誤差が発生しません。これがCOBOLが金融システムで長年信頼されてきた理由の一つです。

試すには

PIC S9(5)V99 の変数に -123.45 という値を入れたとき、実際にメモリ上には符号と数字の並びだけが保持され、小数点そのものは記号として存在しない——という点を頭に置いておいてください。第10章のレッスン49で、実際のメモリ表現をさらに詳しく見ます。