COBOL默认如何处理分割舍入?

RSF*_*on7 5 cobol rounding

在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
Run Code Online (Sandbox Code Playgroud)

当RESULT1/2/3为:

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

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

编辑:负值会发生什么?

即使"丢弃"也是一种舍入模式,它是否相当于向负无穷大或向零舍入?

Bil*_*ger 9

除非你告诉它,否则COBOL不会舍入.

它做了什么,如果你不告诉它做四舍五入,那就是低阶截断.有些人可能更喜欢用其他东西来表达,这并不重要,效果是一样的.截断.

负值以与正值相同的方式处理(保留超出最终结果所需的有效数字,并添加一个(也见后面的解释):-0.009将,到两个小数位,舍入到 - 0.01; -0.004将舍入到-0.00.

如果为字段指定无小数位,则将简单地丢弃任何小数部分.

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

当你的COMPUTEs的所有目标都是9(4)V9时,没有舍入,它们将分别包含0.9,0.5和0.3,并且低位(从第二个十进制数字开始)小数部分被截断.

当你的COMPUTEs的所有目标都是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
Run Code Online (Sandbox Code Playgroud)

以上是相同的.

对于1985年的标准,ROUNDED将最终结果带有一个额外的小数位,并通过在尽可能小的单位添加"1"来调整具有定义小数位的实际字段(对于V99,它将添加百分之一,在V999它将添加千分之一,在没有小数位的情况下,它将添加一个,任何缩放量(参见PICture字符P)它将添加一个).

您可以考虑添加一个绝对值,结果保留原始符号.或者您可以将其视为以任何其他方式完成,从而实现相同的结果.标准描述了舍入,实现符合标准,无论它喜欢什么样的方式.我的描述是对人类理解的描述.没有编译器需要以我描述的方式实现它,但逻辑上结果将是相同的.

不要挂断它是如何实现的.

2014标准取代了2002标准,还有进一步的舍入选项,对于85标准你必须编码(非常容易使用REDEFINES).

`ROUNDED` `MODE IS` `AWAY-FROM-ZERO` `NEAREST-AWAY-FROM-ZERO` `NEAREST-EVEN` `NEAREST-TOWARD-ZERO` `PROHIBITED` `TOWARD-GREATER` `TOWARD-LESSER TRUNCATION`
Run Code Online (Sandbox Code Playgroud)

只有一个"模式"可以在同一时间内指定,如果没有指定模式默认为TRUNCATION,建立向后兼容性(与满足那些谁觉得一切都被四舍五入某种类型的.

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

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