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)