COBOL程序输出小数位显示异常求助:输入两位小数仅显示一位
COBOL小数显示问题修复方案
问题根源
- 输入变量
MIDGRD/FINGRD采用PIC 9V9(2)定义,这是隐含小数点的数值存储格式,仅占用3位字符空间(1位整数+2位小数,V为逻辑小数点不占物理存储)。当使用ACCEPT接收带小数点的输入(如1.25)时,系统会从指定列开始读取3个字符,即截取1.2并丢弃末尾的5,导致存储的实际数值为1.20,最终显示时仅呈现一位小数。 - 输出结构
REP-OUT中的MIDTRM GRD变量名包含空格,违反COBOL标识符命名规则,会引发编译错误或变量引用异常。
修复步骤
1. 修正数据定义
新增带显式小数点的编辑型变量用于接收输入,保留数值型变量用于存储/计算;同时修正输出变量名的语法错误。
WORKING-STORAGE SECTION. 01 STUD-REC. 05 STUDNO PIC X(12). 05 STUDNA PIC X(20). 05 MIDGRD-EDIT PIC 9.9(2). // 用于接收带小数点的输入 05 MIDGRD PIC 9V9(2). // 数值存储,支持后续计算 05 FINGRD-EDIT PIC 9.9(2). 05 FINGRD PIC 9V9(2). 05 EOF PIC A VALUE 'Y'. 01 REP-OUT. 05 FILLER PIC X(5). 05 STUDNUM PIC X(17). 05 FILLER PIC X(5). 05 STUDNAME PIC X(20). 05 FILLER PIC X(5). 05 MIDTRMGRD PIC 9.9(2). // 移除变量名中的空格,修正语法错误 05 FILLER PIC X(17). 05 FINALGRD PIC 9.9(2). 05 FILLER PIC X(5).
2. 调整输入与赋值逻辑
使用编辑型变量接收带小数点的输入,再转存到数值型变量;确保输出变量的赋值流程正确。
INPUT-RTN. DISPLAY SCR. DISPLAY 'INPUT: ' AT LINE 1. DISPLAY 'STUDENT NUMBER: ' AT LINE 2. ACCEPT STUDNO AT LINE 2 COLUMN 18. DISPLAY 'STUDENT NAME: ' AT LINE 3. ACCEPT STUDNA AT LINE 3 COLUMN 18. DISPLAY 'MIDTERM GRADE: ' AT LINE 4. ACCEPT MIDGRD-EDIT AT LINE 4 COLUMN 18. // 用编辑型变量接收完整带小数点输入 MOVE MIDGRD-EDIT TO MIDGRD. // 转存到数值变量用于存储/计算 DISPLAY 'FINAL GRADE: ' AT LINE 5. ACCEPT FINGRD-EDIT AT LINE 5 COLUMN 18. MOVE FINGRD-EDIT TO FINGRD. MOVE STUDNO TO STUDNUM. MOVE STUDNA TO STUDNAME. MOVE MIDGRD TO MIDTRMGRD. // 将数值转成编辑型格式用于显示 MOVE FINGRD TO FINALGRD. DISPLAY 'OUTPUT: ' AT LINE 7. DISPLAY 'STUDENT NUMBER: ' STUDNUM AT LINE 8. DISPLAY 'STUDENT NAME: ' STUDNAME AT LINE 9. DISPLAY 'MIDTERM GRADE: ' MIDTRMGRD AT LINE 10. DISPLAY 'FINAL GRADE: ' FINALGRD AT LINE 11. WRITE STUD-REP FROM REP-OUT. DISPLAY 'INPUT AGAIN? [Y\N]: ' AT LINE 13. ACCEPT EOF AT LINE 13 COLUMN 20.
关键说明
9.9(2)是编辑型格式,包含实际小数点字符,占用4位字符空间(1位整数+1位小数点+2位小数),可完整接收1.25这类带小数点的输入;9V9(2)是数值存储格式,V代表逻辑隐含小数点,不占用物理存储,适合用于数值计算场景;- COBOL变量名仅允许由字母、数字、连字符组成,且首字符必须为字母,禁止包含空格。
内容的提问来源于stack exchange,提问作者Jee
相关产品推荐
相关产品推荐

