GnuCOBOL PIC 999V99 - 意外结果?

GnuCOBOL PIC 999V99 - unexpected result?

我在 GnuCOBOL 3.1-rc1.0 下的以下代码有什么问题?

   IDENTIFICATION DIVISION.
   PROGRAM-ID.     NUMTEST.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
    01 NUM         PIC 999V99.
   PROCEDURE DIVISION.
       DISPLAY "ENTER NUMBER: ". 
       ACCEPT NUM.
       DISPLAY "NUMBER = ".
       DISPLAY NUM.
       STOP RUN.

我输入 123.45 作为输入。我期待 123.45 作为输出,但我得到 123.40

这些都是普通的 ACCEPTs,它们只从命令行读取数据(你也可以在那里输入一个大的 lorem ipsum)。

虽然我认为让这个“按预期”工作是合理的要求,但您目前拥有的最佳选择是 ACCEPTPIC X 然后使用 MOVE FUNCTON NUMVAL (INPUT-DATA) TO NUM(也许之前用 FUNCTION TEST-NUMVAL() 测试数据)。对于 DISPLAY,您可能需要一个带有 PICTURE 的编辑字段,例如 ZZ9.99.

无论如何:请注意 V 是一个 隐含的 小数点,它不是实际存储的一部分。

使用“扩展的”screenio(=不是从命令行输入)有一些好处(比如只允许数字数据并且不超过字段的大小)但有不同的罪魁祸首(例如你应该使用 COLUMN/LINE 和数字 ACCEPT 在 GC 3.1 中仍然存在一些问题)。

正如 JoelFan 所建议的那样,我已经测试了编辑的字段 - 这些当前 在“命令行模式”下正确工作(所以如果使用定位等任何属性则不会):

       PROGRAM-ID.     NUMTEST.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
        01 NUM-INP     PIC 999.99.
        01 NUM         PIC 999V99.
        01 NUM-OUT     PIC zz9.99.
       PROCEDURE DIVISION.
           DISPLAY "ENTER NUMBER: ". 
           ACCEPT NUM-INP.
           DISPLAY "NUMBER = ".
           MOVE NUM-INP TO NUM
           MOVE NUM     TO NUM-OUT
           DISPLAY NUM "/" NUM-OUT.
           STOP RUN.

生成预期结果:

ENTER NUMBER:
123.45
NUMBER =
123.45/123.45

ENTER NUMBER:
1.2
NUMBER =
001.20/  1.20

ENTER NUMBER:
a
NUMBER =
000.00/  0.00

ENTER NUMBER:
1234567
NUMBER =
567.00/567.00

注意:当使用 -fec=all / -debug 编译时,第三种情况实际上应该引发异常(目前不会),最后一种情况是完全正确的,因为数字是右对齐的。

仍然:ACCEPT输入字母数字数据,显式 checks/conversions,并像上面的 NUM-OUT 一样显示为编辑字段是最安全的选择。