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

时间:2015-05-13 12:37:47

标签: rounding cobol

在COBOL中,

的结果是什么?
$str = "hello:evening:";
echo preg_replace("/\:[^)]+\:/","",$str);

当RESULT1 / 2/3为:

  1. PIC S9(4)
  2. PIC S9(4)V9
  3. PIC S9(4)V99
  4. 或者,换句话说,COBOL分区的默认舍入模式是什么?

    修改:否定值会发生什么?

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

1 个答案:

答案 0 :(得分:9)

除非你告诉它,否则COBOL不会进行四舍五入。

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

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

如果您为字段指定无小数位,则只会丢弃任何小数部分。

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

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

当你的COMPUTEs的所有目标都是9(4)V99时,它们将包含0.97,0.50和0.32,其中低位小数部分超出被截断的范围。

您可以使用ROUNDED短语对任何算术动词(ADD,SUBTRACT,MULTIPLY,DIVIDE,COMPUTE)的结果进行四舍五入。

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

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

以上是相同的。

对于1985年的标准,ROUNDED使用一个额外的小数位来获得最终结果,并通过添加"一个"来调整具有定义的小数位的实际字段。在尽可能小的单位(对于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`

只有一种"模式"可以一次指定,如果没有指定MODE IS,则默认为TRUNCATION,建立向后兼容性(并且满足那些感觉所有是某种类型的四舍五入的人。

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

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