如何在COBOL中将整数值转换为十进制值?
我需要将1234567显示为12345.67
我无法将变量除以100。
答案 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,则可以使用其他字段以正确的位置访问它。