计算在cobol四舍五入

我对cobol中的计算函数四舍五入感到困惑。

宣言:

VAR-A      PIC  S9(9)V99 COMP-3.
VAR-B      PIC  S9(9)V9(6) COMP-3.

程序。

MOVE +12.08 TO VAR-A.
MOVE +6.181657 TO VAR-B.


COMPUTE VAR-A ROUNDED = VAR-A + VAR-B.

VAR-A的结果是18.27还是18.26? cobol在计算上会做什么? 它是否将VAR-B首先循环到VAR-A中指定的小数位,或者将cobol添加2个变量,然后将它们四舍五入到VAR-A中指定的小数位?

任何帮助将不胜感激。

@NealB,

这个例子如何:

宣言:

01  VAR-ARRAY  OCCURS 22 TIMES.
    03  VAR-A      PIC  S9(9)V9(6) COMP-3.


01  VAR-B      PIC  S9(9)V99 COMP-3.

假设VAR-A是一个数组,下面是它的值:

VAR-A(01) =  123.164612
VAR-A(02) =  12.07865
VAR-A(03) =  6.181657
VAR-A(04) =  1.744353
VAR-A(05) =  6.118182
VAR-A(06) =  1.744353
VAR-A(07) =  6.158715
VAR-A(08) =  1.744353
VAR-A(09) =  6.194759
VAR-A(10) =  1.744353
VAR-A(11) =  3.037896
VAR-A(12) =  1.743852
VAR-A(13) =  6.14653
VAR-A(14) =  1.744353
VAR-A(15) =  0.000377
VAR-A(16) =  1.743852
VAR-A(17) =  6.144363
VAR-A(18) =  1.743852
VAR-A(19) =  0.007649
VAR-A(20) =  1.744353
VAR-A(21) =  0.000377
VAR-A(22) =  1.744353

VAR-B的价值是:

VAR-B = 405.25

程序:

PERFORM VAR-IDX FROM 1 BY 1 UNTIL VAR-IDX > 22
  COMPUTE VAR-B ROUNDED = VAR-B + VAR-A(VAR-IDX)
END-PERFORM.

为什么计算后得到VAR-B的597.87?


我相信默认的COBOL舍入行为是:离零最近。

COMPUTE VAR-A ROUNDED = VAR-A + VAR-B

应该导致VAR-A包含18.26

评估表达式后会发生舍入。 一个更有趣的例子可能是:

01  VAR-A      PIC  S9(9)V99 COMP-3.               
01  VAR-B      PIC  S9(9)V9(6) COMP-3.             
01  VAR-C      PIC  S9(9)V9(6) COMP-3.             

 MOVE +12.08 TO VAR-A.                         
 MOVE +06.182000 TO VAR-B.                     
 MOVE +00.004000 TO VAR-C.                     
 COMPUTE VAR-A ROUNDED = VAR-A + VAR-B + VAR-C.

结果是18.27。 在进行加法之前将VAR-BVAR-C舍入到2个小数位将产生18.26,因为VAR-B舍入到6.18,VAR-C舍入到0.00。 其结果实际上是18.27,因此在对表达式进行评估之后进行四舍五入。

回复编辑的问题

不是很漂亮的输出,但这是我的计算如何使用IBM Enterprise COBOL for z / OS

VAR-IDX = 01 VAR-B = +405.25 VAR-A = +123.164612 VAR-B + VAR-A = +528.41
VAR-IDX = 02 VAR-B = +528.41 VAR-A = +012.078650 VAR-B + VAR-A = +540.49
VAR-IDX = 03 VAR-B = +540.49 VAR-A = +006.181657 VAR-B + VAR-A = +546.67
VAR-IDX = 04 VAR-B = +546.67 VAR-A = +001.744353 VAR-B + VAR-A = +548.41
VAR-IDX = 05 VAR-B = +548.41 VAR-A = +006.118182 VAR-B + VAR-A = +554.53
VAR-IDX = 06 VAR-B = +554.53 VAR-A = +001.744353 VAR-B + VAR-A = +556.27
VAR-IDX = 07 VAR-B = +556.27 VAR-A = +006.158715 VAR-B + VAR-A = +562.43
VAR-IDX = 08 VAR-B = +562.43 VAR-A = +001.744353 VAR-B + VAR-A = +564.17
VAR-IDX = 09 VAR-B = +564.17 VAR-A = +006.194759 VAR-B + VAR-A = +570.36
VAR-IDX = 10 VAR-B = +570.36 VAR-A = +001.744353 VAR-B + VAR-A = +572.10
VAR-IDX = 11 VAR-B = +572.10 VAR-A = +003.037896 VAR-B + VAR-A = +575.14
VAR-IDX = 12 VAR-B = +575.14 VAR-A = +001.743852 VAR-B + VAR-A = +576.88
VAR-IDX = 13 VAR-B = +576.88 VAR-A = +006.146530 VAR-B + VAR-A = +583.03
VAR-IDX = 14 VAR-B = +583.03 VAR-A = +001.744353 VAR-B + VAR-A = +584.77
VAR-IDX = 15 VAR-B = +584.77 VAR-A = +000.000377 VAR-B + VAR-A = +584.77
VAR-IDX = 16 VAR-B = +584.77 VAR-A = +001.743852 VAR-B + VAR-A = +586.51
VAR-IDX = 17 VAR-B = +586.51 VAR-A = +006.144363 VAR-B + VAR-A = +592.65
VAR-IDX = 18 VAR-B = +592.65 VAR-A = +001.743852 VAR-B + VAR-A = +594.39
VAR-IDX = 19 VAR-B = +594.39 VAR-A = +000.007649 VAR-B + VAR-A = +594.40
VAR-IDX = 20 VAR-B = +594.40 VAR-A = +001.744353 VAR-B + VAR-A = +596.14
VAR-IDX = 21 VAR-B = +596.14 VAR-A = +000.000377 VAR-B + VAR-A = +596.14
VAR-IDX = 22 VAR-B = +596.14 VAR-A = +001.744353 VAR-B + VAR-A = +597.88
FINAL RESULT = +597.88                                               

这取决于中间舍入和最终舍入集。

查看更多信息:

D.13a舍入

COBOL提供了在评估过程中的各个点处的算术语句和表达式中指定四舍五入的能力,以及为接收数据项目中的值而准备的值。

该标准支持八种不同的舍入形式:

•从零开始:四舍五入达到最大值。

•最近从零开始:舍入是最接近的值。 如果两个值相等,则选择幅值较大的值。 这种模式历来与标准COBOL以前版本中的ROUNDED子句相关联。

•最近 - 偶数:舍入为最接近的值。 如果两个值相等,则选择最右边数字为偶数的值。 这种模式有时被称为“银行家舍入”。

•NEAREST-TOWARD-ZERO:舍入为最接近的值。 如果两个值相等,则选择较小幅度的值。

•禁止:由于无法准确地以所需格式表示值,因此EC-SIZE-TRUNCATION条件被设置为存在且操作结果未定义。

•TOWARD-GREATER:四舍五入是代数值较大的最接近的值。

•TOWARD-LESSER:四舍五入是代数值较小的最接近的值。

•截断:舍入为最小值,其值越小越好。 历史上这种模式与ROUNDED子句的缺失以及之前COBOL标准中形成的中间结果有关。

程序员可以指定在通过ROUNDED子句存储到接收数​​据项中时各个中间值的舍入方式; 当ROUNDED子句通过IDENTIFICATION DIVISION的OPTIONS段落的DEFAULT ROUNDED MODE子句在接收数据项上没有进一步限定时,可以选择舍入的默认模式; 并可指定如何通过中间循环子句对中间格式的算术运算和转换进行四舍五入。

D.13a.1中级舍入

中间舍入适用于检索数据项以包含在算术运算或算术表达式中以及执行算术运算符以产生中间结果期间。

在之前的标准中,对于标准算术中的乘法和除法,对不精确结果舍入的默认模式被截断为32位有效数字。 此标准中的默认值不变,也是标准二进制和标准十进制算术的默认值。

当中间值可以恰当地以适当的中间格式表示时,使用确切的值。

如果值不能被精确地表示,用户现在也可以通过识别的OPTIONS段的可选的INTERMEDIATE ROUNDING子句指定用于算术运算和用于算术运算的中间形式的转换的其他舍入模式师。

具体而言,以下选项可用:

•中间回转最近 - 从零开始•中间回转最近 - 即使•禁止中间回转•中间回转截止

在D.13a,Rounding中找到了子条款描述。

如果未指定INTERMEDIATE ROUNDING子句,则假定为中间循环为TRUNCATION。 这与以前的标准没有什么不同。

D.13a.2最后四舍五入(ROUNDED条款)

最终四舍五入适用于表达式或陈述的最终结果的形成,在完成陈述或表达式的评估之前,立即将结果置于目的地之前。 这种舍入形式与ROUNDED子句相关。

在以前的COBOL标准中,只提供了两种“最终”舍入方法:向较小量级舍入(截断,由缺少ROUNDED子句表示); 并四舍五入到最接近的值,如果两个值相等,则选择具有较大幅度的值(通过ROUNDED子句的存在来表示)。

ROUNDED子句已得到增强,允许明确选择八种舍入模式中的任何一种(包括以前可用的两种):

•圆形模式从零开始•圆形模式是最近的 - 从零开始•圆形模式是最近的 - 即使•圆形模式是最近的 - 向前 - 零•禁止圆形模式•圆形模式朝向 - 大 - 圆形模式向下•圆形模式是截断

如果给定结果不存在ROUNDED子句,则应用ROUNDED MODE IS TRUNCATION的规则。

提供了IDENTIFICATION DIVISION的OPTIONS段落中的可选DEFAULT ROUNDED MODE子句,以允许用户指定ROUNDED子句出现的任何操作的舍入模式,而无需MODE子条款。
DEFAULT ROUNDED MODE子句可以采用以下任何一种形式:

•默认圆形模式为从零开始•默认圆形模式为最近从零开始•默认圆形模式为最近 - 即使•默认圆形模式为最近 - 向前 - 零•禁止默认圆形模式•默认圆形模式正在朝着更大的方向•默认的圆形模式是向下的•默认的圆形模式是截断

在D.13a,四舍五入中描述了DEFAULT ROUNDED MODE子句的子句。

如果程序中没有出现DEFAULT ROUNDED MODE子句,则没有MODE IS子句的ROUNDED子句的效果就好像已经指定了ROUNDED MODE是从最近的ZERO开始。 这提供了以前的COBOL标准中可用的相同功能。

如果出现DEFAULT ROUNDED MODE子句,则将没有MODE IS子句的ROUNDED子句视为已使用在DEFAULT ROUNDED MODE子句中指定的舍入模式指定它们。


IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.

01  VAR_NUM PIC  9(3)V9(02).
01  VAR_RESULT PIC 9(3).


PROCEDURE DIVISION.
    MOVE 256.50 TO VAR_NUM.
    COMPUTE VAR_NUM ROUNDED = VAR_NUM / 100. 
    MULTIPLY 100 BY VAR_NUM
    MOVE VAR_NUM TO VAR_RESULT.
   DISPLAY "Result : " VAR_RESULT.

STOP RUN.
链接地址: http://www.djcxy.com/p/55043.html

上一篇: compute rounded in cobol

下一篇: Extract currency from formatted amount