GnuCOBOL PIC 999V99-意外结果?

GnuCOBOL PIC 999V99-意外结果?,cobol,gnucobol,Cobol,Gnucobol,在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.

在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,它们是纯的接受,它们只从命令行读取数据(你也可以在那里输入一个大的lorem ipsum)

虽然我认为这是一个合理的要求,使其“按预期”工作,但您目前的最佳选择是
仅接受
picx
,然后使用
将FUNCTON NUMVAL(输入数据)移动到NUM
(之前可能使用
函数测试-NUMVAL()
测试数据)。对于
DISPLAY
,您可能需要一个带有
PICTURE
的编辑字段,如
ZZ9.99

在任何情况下:请注意
V
是一个隐含的小数点,它不是实际存储的一部分

使用“扩展”屏幕IO(=不从命令行输入)会带来一些好处(比如只允许数字数据,不允许超过字段大小),但也有不同的缺点(例如,您应该使用
/
,而数字
接受
在GC 3.1中仍然存在一些问题)

正如JoelFan所建议的那样,我已经测试了编辑过的字段-这些字段目前只有在“命令行模式”下才能正常工作(因此,如果使用了定位等属性,则不会):

产生预期结果:

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
编译时,第三种情况实际上会引发异常(目前没有),最后一种情况是完全正确的,因为数字是右对齐的


仍然:
接受字母数字数据,进行显式检查/转换,并显示为编辑字段,如上面的
NUM-OUT
是最安全的选择。

感谢您的帮助。看来我需要研究一下函数NUMVAL的事情。我以前从未见过它(我上一次接触COBOL是在1988年或1989年,在大学!)如何更改
INPUT-DATA
以使用编辑过的pic(
999.99
)而不是
999V99
)?GnuCOBOL可能不接受带有小数点的编辑项作为“扩展”(非命令行)屏幕输入,但如果您不需要“扩展”版本,在非标准使用方面没有问题(大多数屏幕i/o未标准化),然后:是的,它工作正常(只要您只输入有效数据)。我将更新帖子。是的,我可以确认PIC 999.99在输入123.45时能完美工作。非常感谢Simon和JoelFan
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