COBOL 默认情况下如何处理除法舍入?

How COBOL handles division rounding by default?

在 COBOL 中,

的结果是什么
COMPUTE RESULT1  = 97 / 100
COMPUTE RESULT2  = 50 / 100
COMPUTE RESULT3  = 32 / 100
COMPUTE RESULT4  = -97 / 100
COMPUTE RESULT5  = -50 / 100
COMPUTE RESULT6  = -32 / 100

当RESULT1/2/3是:

  1. 图片 S9(4)
  2. PIC S9(4)V9
  3. PIC S9(4)V99

或者换句话说,COBOL 除法的默认舍入模式是什么?

编辑:负值会怎样?

甚至"discard"也是一种舍入模式,它相当于向负无穷大或向零舍入吗?

COBOL 不进行舍入,除非您告诉它。

如果您不告诉它进行舍入,它所做的就是低位截断。有些人可能更喜欢用别的东西来称呼,这并不重要,效果是一样的。截断。

负值的处理方式与正值相同(保留超出最终结果所需有效数字的有效数字,并在其上加一(另见后面的解释):-0.009 将保留两位小数位,四舍五入为 -0.01;-0.004 将四舍五入为 -0.00。

如果您指定字段没有小数位,任何小数部分将被简单地丢弃。

因此,当您的 COMPUTE 的所有目标都是 9(4) 时,它们都将包含零,包括负值。

当你的COMPUTEs的所有目标都是9(4)V9时,没有四舍五入,它们将分别包含0.9、0.5和0.3,低位(从小数点后第二位开始)小数部分被截断。

并且当您的 COMPUTE 的所有目标都是 9(4)V99 时,它们将包含 0.97、0.50 和 0.32,其中的低位小数部分将被截断。

您通过对任何算术动词(ADD、SUBTRACT、MULTIPLY、DIVIDE、COMPUTE)的结果使用 ROUNDED 短语来使用该语言进行舍入。

ADD some-name                 some-other-name   GIVIING                some-result
                                ROUNDED

COMPUTE some-result ROUNDED   = some-name
                              + some-other-name

以上是等价的。

对于 1985 标准,ROUNDED 将最终结果多一位小数,并通过在最小可能的单位添加 "one" 来调整具有定义的小数位的实际字段(对于 V99,它将添加一位百分之一,V999加一千分之一,无小数位加一,任意缩放量(见图片字符P)加一。

可以考虑做一个绝对值加一,结果保留原来的符号。或者你可以认为它是用任何其他方式完成的,可以达到相同的结果。标准描述了舍入,实现以任何它喜欢的方式满足标准。我的描述是对人类理解的描述。没有编译器需要按照我描述的方式实现它,但逻辑上结果是相同的。

不要纠结于它是如何实现的。

取代 2002 标准的 2014 标准有更多的舍入选项,对于 85 标准,您必须为此编写代码(非常容易使用 REDEFINES)。

`ROUNDED` `MODE IS` `AWAY-FROM-ZERO` `NEAREST-AWAY-FROM-ZERO` `NEAREST-EVEN` `NEAREST-TOWARD-ZERO` `PROHIBITED` `TOWARD-GREATER` `TOWARD-LESSER TRUNCATION`

一次只能指定一个"mode",如果未指定MODE IS则默认为TRUNCATION,建立向后兼容性(满足那些觉得一切都是某种类型的舍入。

PROHIBITED 选项很有趣。例如,如果结果字段有两个小数位,则 POHIBITED 要求计算结果 只有两个高位小数位 并且所有低位值为零。

重要的是要注意 COMPUTE 只有最终结果是四舍五入的,中间结果不是。如果您需要中间舍入,则每个舍入结果需要一个 COMPUTE(或其他算术动词)。