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
这些都是普通的 ACCEPT
s,它们只从命令行读取数据(你也可以在那里输入一个大的 lorem ipsum)。
虽然我认为让这个“按预期”工作是合理的要求,但您目前拥有的最佳选择是 ACCEPT
仅 PIC 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
一样显示为编辑字段是最安全的选择。
我在 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
这些都是普通的 ACCEPT
s,它们只从命令行读取数据(你也可以在那里输入一个大的 lorem ipsum)。
虽然我认为让这个“按预期”工作是合理的要求,但您目前拥有的最佳选择是 ACCEPT
仅 PIC 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
一样显示为编辑字段是最安全的选择。