COBOL 在对两个十进制数求和时抑制最后一个数字

COBOL supress last number while summing two decimal numbers

根据下面的 COBOL 代码,当我尝试将 WS-NUM1 与 WS-NUM2 相加时,COBOL 似乎抑制了最后一个数字。例如:变量 WS-NUM1 和 WS-NUM2 是 10.15,我得到的结果是 20.20,但预期是 20.30。怎么了?

WS-NUM1 PIC 9(2)V99.
WS-NUM2 PIC 9(2)V99.
WS-RESULTADO PIC 9(2)V99.

DISPLAY "Enter the first number:"
ACCEPT WS-NUM1.
DISPLAY "Enter the second number:"
ACCEPT WS-NUM2.
COMPUTE WS-RESULTADO = WS-NUM1 + WS-NUM2.

提前致谢。

如果我这样声明

01 WS-NUM1 PIC 9(2)V99. 
01 WS-NUM2 PIC 9(2)V99. 
01 WS-RESULTADO PIC 9(2)V99.

然后这样定义和总结

SET WS-NUM1 TO 10.15.
SET WS-NUM2 TO 10.15.

COMPUTE WS-RESULTADO = WS-NUM1 + WS-NUM2.
DISPLAY WS-RESULTADO.

我得到了 20.30 的预期结果。

PIC 9(2)v99 定义了一个隐含小数位的变量,而不是真正的小数位。您正在尝试输入包含小数点的数据,但它不起作用,因为您必须去掉“.”。使数据的数字部分适合工作存储区占用的 4 个字节。

   PROGRAM-ID. ADD2.

   data division.
   working-storage section.

   01 ws-num-input pic x(5).

   01 WS-NUM1 PIC 9(2)V99 value 0.
   01 redefines ws-num1.
      05 ws-high-num  pic 99.
      05 ws-low-num   pic 99.

   01 WS-NUM2 PIC 9(2)V99 value 0.
   01 redefines ws-num2.
      05 ws-high-num2  pic 99.
      05 ws-low-num2   pic 99.

   01 WS-RESULTADO PIC 9(2)V99.

   PROCEDURE DIVISION.
   DISPLAY "Enter the first number:"
  *
   accept ws-num-input
   unstring ws-num-input delimited by '.'
       into ws-high-num, ws-low-num 

   DISPLAY "Enter the second number:"
   accept ws-num-input
   unstring ws-num-input delimited by '.'
       into ws-high-num2, ws-low-num2 
  *
   COMPUTE WS-RESULTADO = WS-NUM1 + WS-NUM2.
   DISPLAY WS-RESULTADO
   STOP RUN
   .

这只是一个简单的演示。在现实世界的应用程序中,您必须确保进行更可靠的编辑以确保输入有效的数字数据。

这看起来像是特殊类型的工作PICture: 编辑过的图片

事实上,你似乎知道香草 PICture 子句(我写 PICture 因为你可能知道你可以写 PICPICTURE ). 普通数字 PIC 仅包含 4 个不同的符号(以及括号和数字以重复某些符号)

  1. 9 : 代表一个数字。您可以像之前说的那样在括号之间使用数字来重复。
  2. S : 表示数字是有符号的
  3. V : 显示隐式小数点的位置
  4. P :有人告诉我它存在,但老实说我从未在我工作场所的代码库中找到它。它是另一种用于缩放因子的小数点,但我对此了解不多。

But there are other symbols.

如果您使用这些其他神秘符号,数字 PIC 将变成经过编辑的数字 PIC。顾名思义,编辑后的 ​​PICture 是用来显示的。它将允许您格式化您的数字以便更好地呈现或接收格式化为人类阅读的数字。

编辑后,您不能使用它进行计算,因此您必须从编辑转移到香草才能对后者进行计算。为了显示您的结果,您从 vanilla 移动到 edited。

所以现在我将揭示其中的一些神秘符号:

  1. B : 在原处插入空格
  2. 0 : 在原处插入一个零
  3. . : 在原处插入小数点
    • :如果数字是正数则插入一个+,如果数字是负数则插入一个-
  4. Z : 如果它代表的数字的值不是 0,则表示为 9。如果数字的值为 0,则表示为空白。

据我所知还有 : / , CR DB * $ - 您可以在互联网上查找它。他们真正展现了cobol的会计本质。

对于您的问题,我们对“.”非常感兴趣。这将使我们能够在您输入时考虑到您所写的小数点。 作为奖励,我还将使用 Z,如果数字小于 10,这将使您的结果看起来像 2.37 而不是 02.37。

Note that you cannot use the repeating pattern with parenthesis ( 9(03) for instance) when describing an edited picture ! Each digits has to represented explicitly

    IDENTIFICATION DIVISION.
        PROGRAM-ID. EDITCOMP.
        DATA DIVISION.
            WORKING-STORAGE SECTION.
            01    WS-NUM1-EDITED PIC 99.99.
            01    WS-NUM2-EDITED PIC 99.99.
            01    WS-NUM1-CALC PIC 9(2)V99.
            01    WS-NUM2-CALC PIC 9(2)V99.
            01    WS-RESULTADO-EDITED PIC Z9.99.
        PROCEDURE DIVISION.
            ACCEPT WS-NUM1-EDITED.
            ACCEPT WS-NUM2-EDITED.
            MOVE WS-NUM1-EDITED TO WS-NUM1-CALC.
            MOVE WS-NUM2-EDITED TO WS-NUM2-CALC.
            COMPUTE WS-RESULTADO-EDITED = WS-NUM1-CALC + WS-NUM2-CALC.
            DISPLAY WS-RESULTADO-EDITED.
        STOP RUN.

你应该注意到还有编辑过的字母数字图片。您可以在其中插入空白 (B)、零 (0) 或 / (/)。