如何在COBOL中将整数值转换为十进制值

时间:2011-11-18 11:46:28

标签: cobol

如何在COBOL中将整数值转换为十进制值?

我需要将1234567显示为12345.67

我无法将变量除以100。

2 个答案:

答案 0 :(得分:7)

COBOL提供了几种数字表示。有些方便 算术运算,其他便于表达。它需要 一会儿把它们整理出来。

我认为您可能正在寻找隐含的十进制表示法。隐含的 小数由PICture字符串中的字母“V”表示,例如:

  WS-INT-NBR       PIC 9(7).
  WS-DEC-NBR       PIC 9(5)V99.

上述两个声明都包含7位数字,占用7个字节的存储空间。 你可以分配 WS-INT-NBR的值为1234567,如下所示:

  MOVE 1234567 TO WS-INT-NBR

但对WS-DEC-NBR做同样的事情 导致溢出(截断),因为它之前只能容纳5位数 隐含小数点('V')。但是,如果您要执行以下操作:

 MOVE 12345.67 TO WS-DEC-NBR

WS-DEC-NBR的实际内容为1234567(注意小数点 消失,它包含一个等于WS-INT-NBR的值。这就是暗示的含义 小数点。 COBOL'知道'WS-DEC-NBR之间有一个小数点 第5和第6位但实际上并未存储它。任何操作都适用 到WS-DEC-NBR将考虑隐含的小数点。

有了这些知识,你就可以使用另一个COBOL功能了 REDEFINES声明。 REDEFINES告诉编译器应用不同的 数据类型处理规则到相同的存储区域。在一个案例中你想要 将内存区域视为整数:PIC 9(7);在其他情况下,如隐含小数 值:PIC 9(5)V99)。 这样做如下:

 01.
     02 WS-INT-NBR   PIC 9(7).
     02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99.

现在WS-INT-NBR和WS-DEC-NBR占用相同的内存区域(相同的7个字节)。然而 当你参考 WS-INT-NBR使用整数表示。当您引用WS-DEC-NBR时的小数 表示被使用。

这让我们超越了你的问题的“不分100”部分。接下来的是 在需要时显示小数点。 COBOL提供包含的DISPLAY格式 显式'标点符号',其小数点为1。例如:

 01  WS-DEC-DISPLAY    PIC 9(5).99.

WS-DEC-DISPLAY在其PICture子句中包含一个显式小数点(不是 将行末尾的句点与嵌入的PICture子句小数点混淆。 WS-DEC-DISPLAY的内容包含显式小数点。所以,要得到小数 指向显示您需要移动带有隐含小数点的东西,如:

 MOVE WS-DEC-NBR TO WS-DEC-DISPLAY

如果WS-DEC-NBR包含'1234567',则WS-DEC-DISPLAY将在MOVE之后包含'12345.67'。

以下程序和显示为您提供了所有内容:

   IDENTIFICATION DIVISION.                            
   PROGRAM-ID. EXAMPLE.                                
   DATA DIVISION.                                      
   WORKING-STORAGE SECTION.                            
   01.                                                 
       02 WS-INT-NBR   PIC 9(7).                         
       02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99. 

   01  WS-DEC-DISPLAY    PIC 9(5).99.

   PROCEDURE DIVISION.                                 
       MOVE 1234567 TO WS-INT-NBR                      
       MOVE WS-DEC-NBR TO WS-DEC-DISPLAY               
       DISPLAY 'WS-INT-NBR    : ' WS-INT-NBR           
       DISPLAY 'WS-DEC-NBR    : ' WS-DEC-NBR           
       DISPLAY 'WS-DEC-DISPLAY: ' WS-DEC-DISPLAY       

       ADD +1 TO WS-INT-NBR                            
       MOVE WS-DEC-NBR TO WS-DEC-DISPLAY               
       DISPLAY 'INT-NBR PLUS 1: ' WS-DEC-DISPLAY       

       ADD +1 TO WS-DEC-NBR
       MOVE WS-DEC-NBR TO WS-DEC-DISPLAY        
       DISPLAY 'DEC-NBR PLUS 1: ' WS-DEC-DISPLAY

       GOBACK                                   
       .                                        

输出:

WS-INT-NBR    : 1234567 
WS-DEC-NBR    : 1234567 
WS-DEC-DISPLAY: 12345.67
INT-NBR PLUS 1: 12345.68   <= notice which digit incremented
DEC-NBR PLUS 1: 12346.68   <= notice which digit incremented

答案 1 :(得分:1)

使用隐含小数重新定义您的值。 E.G。

10 ws-integer                      pic 9(7) value 1234567.
10 ws-decimal redefines ws-integer pic 9(5)v99.

当你将其称为ws-decimal时,你会得到12345.67。

因此,如果您将某些内容移动到ws-integer,则可以使用其他字段以正确的位置访问它。