【COBOL 書き1-11-3】ZとVで小数点を探る〜環境はいつも突然に

🧩今日の学び
Zは不要な0を消すための表示形式であり、計算用の数値項目として使うものではない。
Vは仮想小数点として計算用の小数位置を示すが、小数点そのものを表示する記号ではない。
・COBOLでは計算用の項目と表示用の項目を分け、値をどう扱うかまで設計する必要がある。

なるお)でも、なんか、ここまで親切にしてあげないと返してくれないなんて、ほんとこぼるんは等価交換主義ですよねー、鋼の錬金術師読みすぎなんですよ、錬成陣書くのが大変なんですよ!

係長)なんの文句なんだよ。

COBOLが全部お膳立てしてくれると思わなければいいだろが。

な)はっ!これが行間を読めないってやつっすか!察せれないってやつっすか!まったく最近の若者はこれだから!

係)どの口が言うんだよ…

な)でもー、桁10桁とかオレのような富裕層の残高が9999999999とか残高表示されてたのに、0000000009とか、いきなり90億円搾取されても気が付きづらくないです?

オレみたいな輝ける未来が待っている者は11桁に一瞬でなっちゃうんですよ?

係)…ちゃんと確認しろよ…

な)いやー、輝きすぎて見えなくなる、太陽みたいなもんですから

係)だったら、もう桁関係ないだろ!そもそもなんで10桁搾取されるんだよ!

な)「この金メッキのよくわからない塊を買えば、幸せになれる可能性がある」とか言われちゃうとテキメンに?

係)なんで金メッキに90億出してるんだよ…

目次

Zを使うと不要な0を消せる

係)いいか、必要のない0は表示させないことができるんだよ。

な)おお!なんて便利機能!

レンジに、今日の運勢機能がつたような感じ!

係)Zだ。

な)む?

係)だからZだ。

な)むむ?

係)Zだっていってるだろ。

な)むむむ?

ついに、おかしくなりました?

あ、ごめんなさい。もっとおかしくなりました?

係)どういう言い直しだよ!

な)だって、何言ってんのって話じゃないっすか!

Z、Z、Zって、いくらZ世代が羨ましくても、係長はシン・ジジィ世代ですからね!

係)シンつければ許されると思ってんじゃねーよ!

ったく、9(10)Z(10)って書くってことだよ。

📝 COBOL sample.cob
01 X PIC 9(10) VALUE 10.
01 Y PIC Z(10) VALUE 10.

9とZでは表示結果が変わる

このXYを表示して確認してみろ。

な)今日も回りくどいっと。

係)うるさいな!

な)こんなんでいいでしょ

📝 COBOL zcheck.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 X PIC 9(10) VALUE 10.
01 Y PIC Z(10) VALUE 10.

PROCEDURE DIVISION.

DISPLAY X.
DISPLAY Y.

STOP RUN.

で、うっとりGO!

💻 ターミナル出力 実行結果
0000000010
        10

むが!!

係長消えた!

係)そうだな。

な)おれの90億円が消えた!弁償して!

係)どうせ90円しかもってないだろ!

な)なんで知ってる!?

係)お前なぁ…

このように、Zは使わない0を消してくれるんだよ。

表示するときに使うと見やすくなるってわけだ。

ZとVを組み合わせると小数点が消える

な)ほーほー。

だったら、これって小数点はどうなるの?

係)やってみろ。

な)えーと、こんな形にしてっと

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 X  PIC 9(10)V9(2) VALUE 10.00.
01 X2 PIC Z(10)V9(2) VALUE 10.00.
01 Y  PIC 9(10).9(2) VALUE 10.00.
01 Y2 PIC Z(10).9(2) VALUE 10.00.

PROCEDURE DIVISION.

DISPLAY X.
DISPLAY X2.
DISPLAY Y.
DISPLAY Y2.

STOP RUN.

んで、うっとりっと

💻 ターミナル出力 実行結果
0000000010.00
        1000
0000000010.00
        10.00

あれ?01 X2 PIC Z(10)V9(2) VALUE 10.00.1000になっちった?

あ、小数点がないのか

係)前回説明したところだな。

な)ほ?本当はVは小数点を表示しないってやつっすか?

係)そうだ、Gnuだと9Vなら小数点を表示する。しかし、ZVなら小数点を表示しないということだ。

な)でも、それ駄目なやつじゃないっすか!こちらの棚の商品は990円ですってポップが貼ってあって、喜び勇んで買ったらそちらは対象外ですって言われるやつじゃないっすか!

家に帰ってるんるんしてレシート見たら愕然とするやつじゃないっすか!

係)金払う前に確認しろよ…

な)えー、ってことは、係長の言うことが正しいって証明されちゃうじゃないっすか!

係)正しくていいだろ!

Z項目は計算には使えない

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 X  PIC 9(10)V9(2) VALUE 10.00.
01 X2 PIC Z(10)V9(2) VALUE 10.00.
01 Y  PIC 9(10).9(2) VALUE 10.00.
01 Y2 PIC Z(10).9(2) VALUE 10.00.

PROCEDURE DIVISION.

ADD 1 TO X.
ADD 1 TO X2.

DISPLAY X.
DISPLAY X2.
DISPLAY Y.
DISPLAY Y2.

STOP RUN.

な)Vで計算すると?

💻 ターミナル出力 実行結果
zcheck1.5.cob:15: error: 'X2' is not a numeric name
   13 | 
   14 | ADD 1 TO X.
   15 > ADD 1 TO X2.
   16 | 
   17 | DISPLAY X.

ブボン!ZVでも計算してくれない!?

係長、もうこぼるんを信じられなくなりました…

係)信じろよ!

計算用と表示用は分けろって言っただろ!

な)くぅ!係長が正しいという悪しき前例が目前まで迫る!

係)どういことだよ!

な)こうだってことね…

計算用のX1を足して、Z/VZ/.で違いを確認するってことすね⋯

📝 COBOL sample.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. NARUO.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 X  PIC 9(10)V9(2) VALUE 10.00.
01 X2 PIC Z(10)V9(2) VALUE 10.00.
01 X3 PIC Z(10).9(2) VALUE 10.00.

PROCEDURE DIVISION.

ADD 1 TO X.

MOVE X TO X2.
MOVE X TO X3.

DISPLAY X.
DISPLAY X2.
DISPLAY X3.
STOP RUN.

で、うんざりGO…

係)うんざりって、どういうことだよ…

💻 ターミナル出力 実行結果
0000000011.00
        1100
        11.00

計算用と表示用は分けて考える

な)あ、あーあー、ああ!あー!

係)なんなんだってんだ…

な)わかっちった!もう大丈夫!そうなればいいってわけっすね!

係)説明しろよ!

な)むー!

Zだと桁の0が消えるけど、Vにしちゃうと小数点はださない

だから、小数点を出すために、ドットで勝負

でもドットで計算しようとすると、数字じゃないからエラーになっちゃうと

だから、計算するためにVで計算していって、最終的にドットで表示用に入れる

ってことでどうざますかしら!

係)お前の言い方のほうが回りくどいからな!

な)どむっ!

係)だが、言いたいことはわかった。

計算用と表示用は分けて考えるってことだな。

な)そこ!簡単にまとめて、主役の座を奪おうとしない!

係)うるさいわ!

だが、わかったろう?環境によるが根本は変わらないからな、できるだけ環境に左右されないようにコードを作り上げるってことだ。

おむすび

な)ふむぅ。

だからいっつも環境環境ってうるさいんすね…だから明治は良かったってうるさいんすね。

係)そうだが、なんで明治になるんだよ!

な)でも、ここ職場環境は悪いっすよね、明治時代みたいに。

係)はぁ?

な)迎賓館の社交ダンス会場じゃなくて、Googleみたいに卓球やスカッシュのコートを用意しておいてほしいですよ!社員の気分転換が大事ってことっすよ!

係)お前が体を動かすわけ無いんだから、全部無駄だろが。

な)ぐふっ!

係長のワンポイント

Zは「0を消す記号」ではない。
本当は“人に見せるための表示形式”を定義する仕組みだ。
よくある誤解はZを付けた項目もそのまま計算できると思うことだが、実際は数値項目として扱えなくなる。
だからVで計算し、Zやドットで表示するという役割分担が必要になる。
その結果、同じ値でも「計算用の姿」と「表示用の姿」を持つことになる。
COBOLは値そのものではなく、“どう扱うか”を設計する言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次