所以我尝试显示某个变量的十进制数,比如说我有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.