接受带符号的值作为记录的一部分

Accepting signed values as part of a record

我有一个相当基本的 Cobol 程序,我正在使用它来了解记录结构。在 ACCEPT 语句中将带符号的数值作为记录的一部分传递时,我注意到 gnucobol 有奇怪的行为。

程序定义如下:

IDENTIFICATION DIVISION.
PROGRAM-ID. TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Account.
  02 Name PIC X(5) VALUE SPACES.
  02 Balance PIC S9999V999 VALUE ZEROES.
PROCEDURE DIVISION.
MAIN.
  DISPLAY "Enter account details:"
  ACCEPT Account.
  DISPLAY "Balance is:"
  DISPLAY Balance.

  STOP RUN.

行为如下:

Enter account details:
AAAAA-123.456
Balance is:
+-123.045

我认为这是由于值在原始内存中的存储方式所致。

这通常是大多数 cobol 编译器所做的吗?有没有办法让 cobol 正确解释带符号的值?

I assume this is due to how the value is stored in raw memory.

Is this generally what most cobol compilers do?

一个猜测:是的(实际显示会有所不同,但我相信大多数 COBOL 环境不会按照您的意愿行事,至少是这样)

Is there a way to get cobol interpreting the signed value properly?

是的,但是有 "COBOL" 件事要做:

  • 以内部格式存储数据(就像您所做的那样:带有隐含 3 个小数位的带符号值),但是对于 ACCEPT 并且可能 DISPLAY 使用实际包含您想要的数据的格式,例如 PIC +ZZZ9.999$,有关详细信息,请参阅 this answer
  • 从不 ACCEPT 一条记录,要么分成多个 ACCEPT 要么使用一个接受屏幕名称的记录,而不是记录名称 - -> 使用 SCREEN SECTION 来输入数据,这将为您提供两个独立的字段,并且在大多数 COBOL 环境下都可以进行合理的输入验证。