我将非常感谢任何关于我在下面这个非常简单、非常琐碎的 COBOL 程序中到底做错了什么的指针。它使用 COBOL 的标准工具 ROUNDED 对结果进行舍入。别有用心是构建一个大型应用程序并将时间度量应用于不同的舍入模式,给定一系列操作和每种模式的后续舍入。(更别有用心的是倒过来学COBOL,这只是那个计划内的一个项目,然后尝试着找到一份使用和开发COBOL的工作)。
该程序如下所列。它执行一个简单的加法,并将结果传递给具有较小数据宽度的变量,该变量强制舍入。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. ROUNDINGTEST.
000300 ENVIRONMENT DIVISION.
000400 DATA DIVISION.
000500 WORKING-STORAGE SECTION.
000600 01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745.
000610 01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874.
000610 01 RESULT PIC S9(2)V9(2).
000700 PROCEDURE DIVISION.
000800 PROGRAM-BEGIN.
000900 COMPUTE RESULT ROUNDED MODE NEAREST-EVEN
001000 = OPERAND01 + OPERAND02
001010 END-COMPUTE
001020
001100 PROGRAM-DONE.
001200 STOP RUN.
使用 GnuCOBOL 的编译器进行编译,如下所示,结果如下。
martin@martin-1001PX:~/CobolProjects$ cobc -b ROUNDINGTEST.cob
ROUNDINGTEST.cob: In paragraph 'PROGRAM-BEGIN':
ROUNDINGTEST.cob:11: Error: syntax error, unexpected MODE
martin@martin-1001PX:~/CobolProjects$
没有将指示的模式交换为任何其他模式,截断,向小...产生任何变化。注释掉 000900、001000 和 001010 行会给出无错误的响应,因此很明显,问题不是代码早期的级联问题,也不是后来的任何类型的语法错误——而是四舍五入不起作用。
GNU COBOL 2.0(以前的 OpenCOBOL)[11FEB2012 版本] 程序员指南第 2 版,2013 年 11 月 21 日
具有如下的 COMPUTE 语法
COMPUTE { identifier-1 [ rounding-option ] } … =|EQUAL 算术表达式-1 [ size-error-clause ] [ END-COMPUTE ]
以及限定符 ROUNDED(上面的舍入选项)的语法为
AWAY-FROM-ZERO
NEAREST-AWAY-FROM-ZERO
NEAREST-EVEN
ROUNDED MODE IS NEAREST-TOWARD-ZERO
PROHIBITED
TOWARD-GREATER
TOWARD-LESSER
TRUNCATION
其中“IS”是一个非强制性的可读性选项。
尽管这看起来很紧凑和微不足道,但再多的修订或测试都无法帮助我取得任何成功。任何关于此事的有意义的交流将不胜感激。