我非常感谢指出我在下面这个非常简单,非常简单的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版]程序员指南 第二版,2013年11月21日
具有如下的COMPUTE语法
COMPUTE {identifier-1 [rounding-option]} ... = | EQUAL arithmetic-expression-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”是非强制性可读性选项。
看起来紧凑而琐碎,没有多少修改或测试可以帮助我取得任何成功。关于这个问题的任何有意义的沟通将非常感激。
答案 0 :(得分:1)
(这应该是评论,而不是答案,但希望代码清单显示出来。)
正如比尔指出的那样:
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.
1020期间将编译器的状态从中寻找段落中的另一个语句改为,以查找可能是标签的新段落或语句。