cobol显示十进制值变成00

Decimal value turns into 00 when displayed in cobol

所以我尝试显示某个变量的十进制数,假设我有图片 9(13)v99 并且我有一个值为 000000804793807 的变量 ws-amount -> 我希望显示的值为 000000804793807(只是忽略分隔小数点的'.')但现实是假脱机显示 000000804793800 。 (我不知道07怎么会变成00)..

这是代码

Working storage section
01 WS-AMOUNT-15.                           
   05 WS-AMOUNT-13              PIC 9(13). 
   05 WS-DECIMAL-2              PIC V9(02).

01 WS-VALUE                     PIC 9(15).

PROCEDURE SECTION

MOVE 000000804793807 TO WS-VALUE
MOVE WS-VALUE(1:13)  TO WS-AMOUNT-13.
MOVE WS-VALUE(14:2)  TO WS-DECIMAL-2.
MOVE WS-AMOUNT-15             TO DA-PST-AMOUNT.   
//*TRY TO DISPLAY THE VALUE.  
DISPLAY 'AMT(1:13): ' WS-VALUE(1:13). 
DISPLAY 'AMT(14:2): ' WS-VALUE(14:2).           
DISPLAY 'WS-AMOUNT-13: ' WS-AMOUNT-13.              
DISPLAY 'WS-DECIMAL-2: ' WS-DECIMAL-2.              
DISPLAY 'WS-AMOUNT-15: ' WS-AMOUNT-15.               

结果

AMT(1:13): 0000008047938

AMT(14:2): 07

WS-AMOUNT-13: 0000008047938

WS-DECIMAL-2: 00

WS-AMOUNT-15: 000000804793800

我的结构有问题吗?我希望 07 的小数保留在 ws-amount-15 中,而不是 00 ..

V 是隐含的小数点,计算时会考虑 MOVE

认为 你的代码有一个未定义的行为,因为你 MOVE 一个由数字变量的 reference-modification 创建的中间字母数字项目,到一个数字字段。我的解释使用“假设”,即这在某种程度上仍被识别为数字变量:

MOVE WS-VALUE(1:13)   TO WS-AMOUNT-13.

等于

MOVE '0000008047938'  TO WS-AMOUNT-13.

数字冲突可能通过某种方式解决

MOVE FUNCTION NUMVAL ('0000008047938') TO WS-AMOUNT-13.

相同
MOVE 000000000000000000000000008047938 TO WS-AMOUNT-13.

给出了预期的结果(左边的所有内容都被截断了,这里只包含零 - 没问题)。但是隐含的

MOVE FUNCTION NUMVAL ('07') TO WS-DECIMAL-2.

必须结果为零,因为它与

相同
MOVE 00000007.00000 TO WS-DECIMAL-2.

并且 WS-DECIMAL-2 仅由逗号右侧的 2 个位置组成,仅包括那些 (00),其他小数位(这是一个零所以没问题)和整数位(由您的 07 组成)被截断。

为了使此代码按“预期”工作(仍“假设”字母数字 storage-area 被“视为”有效数字源)删除 V.

我建议为此目的使用重新定义:

       DATA DIVISION.
       WORKING-STORAGE SECTION
       01 WS-VALUE                     PIC 9(15).
       01 WS-VALUE-WITH-2-DECIMAL-POS  REDEFINES WS-VALUE
                                       PIC 9(13)V9(02).
       01 WS-AMOUNT-15                 REDEFINES WS-VALUE
          05 WS-AMOUNT-13              PIC 9(13). 
          05 WS-DECIMAL-2              PIC 9(02).
       
       PROCEDURE DIVISION.
       
       MOVE 000000804793807 TO WS-VALUE
      *> TRY TO DISPLAY THE VALUE.  
       DISPLAY 'AMT(1:13): '    WS-VALUE(1:13). 
       DISPLAY 'AMT(14:2): '    WS-VALUE(14:2).           
       DISPLAY 'WS-AMOUNT-13: ' WS-AMOUNT-13.              
       DISPLAY 'WS-DECIMAL-2: ' WS-DECIMAL-2.              
       DISPLAY 'WS-AMOUNT-15: ' WS-AMOUNT-15.       

       GOBACK.