下面的代码在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
发布于 2020-11-06 16:43:20
这些都是普通的ACCEPT,它们只从命令行读取数据(您也可以在那里输入一个大的lorem )。
虽然我认为这是一个合理的要求,让这个工作“如预期”,您目前拥有的最好的选择是ACCEPT只对PIC X,然后使用MOVE FUNCTON NUMVAL (INPUT-DATA) TO NUM (也许之前用FUNCTION TEST-NUMVAL()测试数据)。对于DISPLAY,您可能需要一个带有PICTURE (如ZZ9.99 )的编辑字段。
无论如何:请注意,V是一个隐含的小数点,它不是实际存储的一部分。
使用"extended“屏幕it (= input不来自命令行)带来了一些好处(比如只允许数字数据,但不超过字段的大小),但是有不同的原因(例如,您应该对其使用COLUMN/LINE,而ACCEPT在GC3.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这样的编辑字段是最安全的选择。
https://stackoverflow.com/questions/64718189
复制相似问题