问题已解决
我发现这行代码比我将这些值移动到输出文件的位置还要深:
INSPECT OUT-RECORD REPLACING ALL X'00' BY ' '
我需要将一个输入的无符号带小数点的数值(PIC 9(3).9(6))写入数据集,并以有符号的COMP-3(PIC S9(3)V9(6))格式表示。对于除了输入数值中小数点周围有0的情况之外,一切正常。在这种情况下,小数点前的0总是变成了4,导致输出错误。
例如:当输入值为31.006261时,它被写成+31.006261(实际输出文件中x'031006261C')。但是,当输入值为30.006261时,它被写成了+34.006261(x'034006261C')。
我不能更改数值的输入方式,但可以更改输入布局。我尝试过多种移动数值的方式,包括:直接从输入移动到COMP-3,将其移动到工作存储器中不同类型的临时字段中,将输入转换为字符字段并移动到数字字段中(忽略小数点)。
下面是我正在做的简化版本:
将我的X'00'更改为X'40',这就是我得到神秘数字'4'的地方。我将把这归因于我所缺少的第一个Cobol版本的“;”。
感谢Bruce和匿名用户user9835153的帮助!
* Value 30.006261 is read into WS-IN-VAL from input file.
01 WS-IN-RECORD.
05 WS-IN-VAL PIC 9(3).9(6).
01 OUT-RECORD.
05 WS-OUT-VAL PIC S9(3)V9(6) COMP-3.
* Working Storage 01 area
05 WS-HOLD-VAL PIC 9(3)V9(6).
05 WS-DISP-VAL PIC +9(3).9(6).
MOVE WS-IN-VAL TO WS-HOLD-VAL.
MOVE WS-HOLD-VAL TO WS-OUT-VAL.
MOVE WS-OUT-VAL TO WS-DISP-VAL.
WRITE WS-OUT-RECORD.
DISPLAY 'VALUE IN: ' WS-IN-VAL.
DISPLAY 'HOLD VALUE: ' WS-HOLD-VAL.
DISPLAY 'VALUE OUT: ' WS-OUT-VAL.
DISPLAY 'FORMATTED: ' WS-DISP-VAL.
VALUE IN: 30.006261
HOLD VALUE: 030006261
VALUE OUT: 030006261
FORMATTED: +030.006261
然而,当我打开带HEX ON的输出文件时,得到了以下结果:
----+
04021
3066C
View of the file with a layout shows: +34.006261.
每当小数点周围有零出现时,就会发生这种情况。我使用了一部分数据,共8条记录,其中一半改为10.1xxxxx,另一半改为10.0xxxxx(x是各种数字)。所有10.0xxxxx的记录都变成了14.0xxxxx,但10.1xxxxx的记录仍然正确。使用20.x、30.x、40.x等方式进行尝试,结果都相同。
我还尝试过在从无符号到有符号时使用COMPUTE而非MOVE,但结果相同。正如我之前提到的,我尝试了各种移动输入值的方法,但结果始终相同。我认为可能是显式十进制(x'4B')的一部分被放置在了上半字节中,因此我修改了输入以单独读取它,并将其十六进制值更改为x'00',但也没有奏效。我完全不知道还能尝试什么,也找不到其他经历过类似问题的人。
关于为什么小数点前的0会被替换为4,有任何想法或建议吗? 编辑 5/21/18:根据提供的建议进行了编辑。
VALUE FROM FILE: 50.022287
VALUE AFTER MOVE: 050022287
VALUE AS COMP-3 (OUTPUT FLD): 050022287
OUTPUT DISPLAYED: +050.022287
VALUE IN FILE: +54.022287
小数点前的零在写入数据集后仍会发生变化。