cobol - 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
解决方案
这些是普通ACCEPT
的,它们只从命令行读取数据(你也可以在那里输入一个大的 lorem ipsum)。
虽然我认为让这个“按预期”工作是一个合理的要求,但您目前拥有的最佳选择只是ACCEPT
ingPIC X
然后使用MOVE FUNCTON NUMVAL (INPUT-DATA) TO NUM
(也许FUNCTION TEST-NUMVAL()
之前测试数据)。因为DISPLAY
您可能想要一个带有PICTURE
like的已编辑字段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
上面那样显示为已编辑的字段是最安全的选择。
推荐阅读
- javascript - 如何在此使用 AJAX 请求但因 textarea 失败的 HTML 表单中找到问题
- libgdx - LibGdx 从 SmbFile 加载纹理
- java - ES256 JWT 验证 - SignatureException:签名的无效编码:java.io.IOException:序列标签错误
- html - 如何在多个文件中使用基本的 html 代码结构
- python - 更快地替代嵌套 for 循环时间
- python - ValueError: int() 以 10 为基数的无效文字:'' 同时将字符串转换为 int 值
- sikuli - Sikuli 脚本无法在 Linux 上运行
- python - 如何在一天中的特定时间在后台运行我的程序?
- reactjs - 带有参数的请求,处理和渲染 SPA - 架构方法
- jquery - 使用ajax + jQuery的Laravel分页不起作用