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

1 cobol

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

我需要将1234567显示为12345.67

我不能将变量除以100.

Nea*_*alB 7

COBOL提供了几种数字表示.一些便于算术运算,另一些便于表示.整理它们需要一段时间.

我想你可能正在寻找隐含的十进制表示法.隐含的小数由PICture字符串中的字母"V"表示,例如:

  WS-INT-NBR       PIC 9(7).
  WS-DEC-NBR       PIC 9(5)V99.
Run Code Online (Sandbox Code Playgroud)

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

  MOVE 1234567 TO WS-INT-NBR
Run Code Online (Sandbox Code Playgroud)

但对WS-DEC-NBR执行相同操作会导致溢出(截断),因为它只能在隐含小数点('V')之前保持5位数.但是,如果您要执行以下操作:

 MOVE 12345.67 TO WS-DEC-NBR
Run Code Online (Sandbox Code Playgroud)

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

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

WS-DEC-DISPLAY在其PICture子句中包含一个显式小数点(不要将该行末尾的句点与嵌入的PICture子句小数点混淆).WS-DEC-DISPLAY的内容包含显式小数点.因此,要显示小数点,您需要移动带有隐含小数点的内容,如:

 MOVE WS-DEC-NBR TO WS-DEC-DISPLAY
Run Code Online (Sandbox Code Playgroud)

如果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                                   
       .                                        
Run Code Online (Sandbox Code Playgroud)

输出:

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