【发布时间】:2011-11-18 11:46:28
【问题描述】:
如何在 COBOL 中将整数值转换为十进制值?
我需要将 1234567 显示为 12345.67
我不能将变量除以 100。
【问题讨论】:
标签: cobol
如何在 COBOL 中将整数值转换为十进制值?
我需要将 1234567 显示为 12345.67
我不能将变量除以 100。
【问题讨论】:
标签: cobol
COBOL 提供了几种数字表示。有些便于 算术运算,其他便于演示。它需要 一段时间来整理它们。
我认为您可能正在寻找隐含的十进制表示。隐含的 十进制由 PICture 字符串中的字母“V”表示,例如:
WS-INT-NBR PIC 9(7).
WS-DEC-NBR PIC 9(5)V99.
以上两个声明都包含 7 个数字,占用 7 个字节的存储空间。 您可以分配 值 1234567 到 WS-INT-NBR 如下:
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 告诉编译器应用不同的 数据类型处理规则到相同的存储区域。在一种情况下,您想要 将内存区域视为整数: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 带有隐含小数点的内容,如:
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
【讨论】:
Hates off to your patience
使用隐含的小数重新定义您的价值。例如
10 ws-integer pic 9(7) value 1234567.
10 ws-decimal redefines ws-integer pic 9(5)v99.
当您将此称为 ws-decimal 时,您将得到 12345.67。
因此,如果您将某些内容移动到 ws-integer,您可以使用其他字段在正确位置使用小数访问它。
【讨论】: