首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GnuCOBOL PIC 999V99 -意外结果?

GnuCOBOL PIC 999V99 -意外结果?
EN

Stack Overflow用户
提问于 2020-11-06 16:22:04
回答 1查看 173关注 0票数 3

下面的代码在GnuCOBOL 3.1-rc1.0下做错了什么?

代码语言:javascript
复制
   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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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所建议的,我已经测试过编辑过的字段--这些工作目前只有在“命令行模式”(如果使用了定位之类的属性时才正确):

代码语言:javascript
复制
       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.

产生预期结果:

代码语言:javascript
复制
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这样的编辑字段是最安全的选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64718189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档