質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

Q&A

解決済

2回答

5396閲覧

COBOLのROUNDEDの計算方法に関して

tokmei

総合スコア17

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

0グッド

0クリップ

投稿2019/06/12 08:56

COBOLに関しましてお伺いしたいことがございます。

COBOLで四捨五入する際に「ROUNDED」という関数を使用すると思います。
この時に、出力される結果が、想定している値と異なっており非常に困っております。
ご教授いただきたく存じます。

実際のCOBOLのコードは以下の様なコードです
※COBOLが未経験のため、正しい記載になっていないと思います。申し訳ございません

[変数1] PIC s9(11) [変数2] PIC s9(11) CONPUTE [変数2] ROUNDED = [変数1]/6/1000

上記のコードに対し、[変数1]に以下の様な数値が入っていた場合

[変数1] = 20036998

[変数2]が 3340と出力されます。
想定していた数値は3339だったため、原因の調査をしております。

勝手な想定ですが、計算の流れが
『CONPUTE [一時変数] ROUNDED = [変数1]/6 』 => 3339499.7 => 四捨五入され3339500
=>『CONPUTE [変数2] ROUNDED = [一時変数]/1000 』 => 3339.500 => 四捨五入され33340
になっているのではないかと思っております。

上記のプログラムは大変古い汎用機で動いているため、プログラムの改変や、四則演算のみ行う等のことは
止められております。

検証ができず、ネットにも情報が落ちていないため、困っております。
ご教授いただければと思います。
また、もしもCOBOLを簡単に実装できる方法等あれば教えていただきたく存じます。
そちらの環境で検証してみたいと思います。

説明が長くなり申し訳ございません。
何卒、お願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

汎用機が何か?COBOLの種類とバージョンを明記するとググって情報が見つかるしれません。

現在では内部的に十進数を二進数に変換して計算し、結果を十進数に変換するのが一般的ですが、変換時に誤差が生じてしまいます。
PCの電卓で質問の式を実行すると、3,339.499666666667‬ と微妙な結果になります。

昔の汎用機のCOBOL(他の言語も?)出身演算回路を使っていたので十進数←→二進数変換の誤差がありませんでした。できるなら汎用機メーカーに問い合わせてみては?汎用機ならメンテナンス料を払い続けているはず。

以下、憶測で
20036998 / 6 → 3,339,499.666666667
この結果が ROUNDED された中間ワークが 3,339,500 になる。
3,339,500 / 1,000 → 3,339.5
が ROUNDED されて 3,340。

投稿2019/06/13 00:01

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokmei

2019/06/13 00:38

Orlofsky様 ご回答いただき、ありがとうございました。 非常に参考になりました。 おっしゃる通り、汎用機でございます。 しかしながら、大変古いもののため、ベンダー様でも情報がほとんどなく、汎用機に対するメンテナンス料も払っておりません。 機械だけが存在している形です。。。 Orlofsky様が想定されている、処理の流れであれば確かに納得ができる理由ですので、ベンダーに問い合わせて検証できないか相談してみようと思います。 大変、勉強になりました。 ありがとうございます。
Orlofsky

2019/06/13 00:59 編集

どこの汎用機かなどを書きたくなければそれでも構いません。 [変数1] PIC s9(11) [変数2] PIC s9(11) が少数点以下も持つ(何桁まで持つかはやってみないとわからない)と結果も変わるはず。 [変数11] PIC s9(11) を追加して、 CONPUTE [変数11] ROUNDED = [変数1] / 6. CONPUTE [変数2] ROUNDED = [変数11] / 1000. で試してみては?
guest

0

opencobolというフリーの処理系があります。

試してみたところ、3339 ですね。

汎用機であれば、機器ベンダーからマニュアルを入手してください。
おそらく、文法書とプログラミングガイドの二種類あるはず。

投稿2019/06/12 09:51

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokmei

2019/06/13 00:32

otn様 ご回答いただきまして、誠にありがとうございます。 フリーのもので、検証できるものがあるとは、非常に助かります。 ご教授いただき、ありがとうございます。 一度ベンダー様に問合せしてみようと思います。 また、プログラミングガイドもあったかと思いますので、書類をひっくり返して探してみようと思います。 この度は、ご回答いただき非常に参考になりました。 重ねてお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問