【问题标题】:How do I convert an integer value to decimal value in COBOL如何在 COBOL 中将整数值转换为十进制值
【发布时间】:2011-11-18 11:46:28
【问题描述】:

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

我需要将 1234567 显示为 12345.67

我不能将变量除以 100。

【问题讨论】:

    标签: cobol


    【解决方案1】:

    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
    

    【讨论】:

    • 这是一个值得解释的 NealB。 Hates off to your patience
    【解决方案2】:

    使用隐含的小数重新定义您的价值。例如

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

    当您将此称为 ws-decimal 时,您将得到 12345.67。

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

    【讨论】:

    • 我试过了,但是在这样做之后我得到 vale 为 34567.00
    • 你必须做一个“将 ws-integer 移动到 ws-decimal”,你需要重新定义数据区域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2013-04-18
    • 1970-01-01
    • 2011-12-10
    • 2018-07-16
    相关资源
    最近更新 更多