在cobol中显示时,十进制值变为00

  • 本文关键字:十进制 cobol 显示 cobol
  • 更新时间 :
  • 英文 :


所以我尝试显示某个变量的十进制数,比如说我有pic 9(13(v99,我有一个值为000000804793807->我期望显示的值是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是一个中间字母数字项,由数字变量的引用修改创建,指向一个数字字段。我的解释使用了";假设";这在某种程度上仍然被认为是数字变量:

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只由逗号右侧的两个位置组成,因此只包括那些(00(,其他小数位数(是一个零,所以没有问题(和整数位数(由07组成(将被截断。

为了使该代码作为";预期的";(仍然"假设"字母数字存储区域被"认为"是有效的数字源(丢弃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.

最新更新