Por que o ponto (ou vírgula) decimal não aparece?

Uma dúvida comum para quem está começando a programar em Cobol e ainda se confunde com os conceitos de ponto decimal implícito e ponto decimal explícito.

Você quer exibir na tela ou num relatório uma variável numérica com casas decimais e codificar um programa como esse:

identification division.
program-id. gtc001.
data division.
working-storage section.
01 item-de-grupo.
    03 item-elementar pic 9(003)v9(002) value 123.45.
procedure division.
inicio.
    display item-elementar
    stop run.

…e o que aparece na tela é algo como…

[~/cbl]$ ../bin/gtc001
12334

O ponto não aparece porque a picture 9(003)v9(002) indica que o campo possui um ponto decimal implícito após a terceira posicional. Na prática esse ponto não existe fisicamente.

Para que ele “exista” e seja exibido, há duas soluções possíveis:

  1. Transformar a variável de numérica em numérica editada
identification division.
program-id. gtc001.
data division.
working-storage section.
01 item-de-grupo.
    03 item-elementar pic zz9.99 value 123.45.
procedure division.
inicio.
    display item-elementar
    stop run.

Nesse caso, pic zz9.99 é uma variável numérica editada; o ponto decimal existe fisicamente e será exibido pelo programa:

[~/cbl]$ ../bin/gtc001
123.34

O incoveniente dessa solução é que variáveis numéricas editadas não podem ser usadas em operações aritméticas. Num programa real, onde a variável item-elementar tivesse que passar por cálculos ou coisas assim, teríamos que partir para uma segunda solução.

2) Copiar o conteúdo da variável original para uma variável numérica editada antes da exibição

identification division.
program-id. gtc001.
data division.
working-storage section.
01 item-de-grupo-1.
    03 item-elementar-1 pic 9(003)v9(002) value 123.45.
01 item-de-grupo-2.
    03 item-elementar-2 pic zz9.99 value zeros.
procedure division.
inicio.
    move item-elementar-1 to item-elementar-2
    display item-elementar-2
    stop run.

Que também exibiria…

[~/cbl]$ ../bin/gtc001
123.34

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *