首页 > 解决方案 > GnuCOBOL PIC 999V99 - 意外结果?

问题描述

我在 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

标签: cobolgnucobol

解决方案


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

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

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

使用“扩展”screenio(=不是从命令行输入)有一些好处(比如只允许数字数据并且不超过字段的大小)但有不同的罪魁祸首(例如你应该使用COLUMN/LINE并且 numericACCEPT仍然有一些问题在 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输入字母数字数据,进行明确的检查/转换,并像NUM-OUT上面那样显示为已编辑的字段是最安全的选择。


推荐阅读