从文件中读取COBOL浮点数

4
我有一个文件,每行都有一个固定的数字,格式为S9(6)V9(2),但在实际读取时,在进行数学运算时出现了非数字错误。更重要的是,当我尝试在程序中显示它们时,以567123.45写入文件的数字会在变量中保存为+567123.04。例如,来自文件的数字123.45被保存在变量中为+123.45.00,并引发以下错误'WS-VALUE' not numeric: '123.45 0'。这是为什么呢?
我正在使用Windows版的OpenCobolIDE 4.7.4
编辑: 文件记录如下,并以换行符分隔(逐条记录通过READ操作读取):
  01 WS-OPERATION.
     05 WS-ID PIC A(2).
     05 WS-CLIENT PIC 9(5).
     05 WS-COUNTRY PIC A(4).
     05 WS-VALUE PIC S9(6)V9(2). 

首先,这些不是浮点项,因为只有“USAGE FLOAT…”才是浮点项。实际上,这些是定点项。问题: 您使用哪个编译器?我假设您使用的是标准的GnuCOBOL 1.1 - 如果您更改了编译器路径,则可以在菜单?->关于OpenCobolIDE中找到此信息。 您如何读取文件,文件及其记录描述看起来像什么?DISPLAY语句是什么样子的? - Simon Sobisch
是的,我正在使用1.1.0版本。我已经编辑了有关文件结构的帖子。 - Quentin
我强烈建议将“浮点数”部分也改为“定点数”。 - Simon Sobisch
你的记录不是固定长度的,对吗?即使它们是,数据也是“左对齐”在字段中的,对吧?你能够添加一些实际的、完整的数据记录到你的问题中吗? - Bill Woodger
回答你的具体问题“为什么呢?”,那是因为“+123.45.00”不是有效的数字;数字字段值不会有两个小数点。而且它也不符合“S9(6)V9(2)”格式。 - user2338816
@Quentin,提供的答案对你有用吗?如果是,请将其标记为答案;如果不是,请在答案下评论你缺少什么。 - Simon Sobisch
1个回答

5
原因是您试图取消编辑一个字段。数据中的567123.45不符合PIC S9(6)V9(2),而是符合-9(6).9(2) - 内部存储数据和打印数据之间的区别。
简单地更改定义并使用MOVE WS-VALUE TO WS-VALUE-INTERNAL(像您希望的那样定义)可能适用于特定编译器(和特定数据),但我会选择另一种方法:
我建议在对其进行任何操作之前始终验证数据(文件可能已损坏或外部编辑)。至少检查像WS-CLIENT这样的简单数字数据是否为IS NUMERIC,并对数据字段WS-VALUE执行完整验证,或者至少使用MOVE FUNCTION NUMVAL(WS-VALUE) TO WS-VALUE-INTERNAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接