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.
所以我尝试显示某个变量的十进制数,假设我有图片 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.