Operaciones aritméticas con decimales - Curso de COBOL y PowerCOBOL - Capítulo 15

En este capítulo vamos a añadir al programa del capítulo anterior la posibilidad de incluir números decimales en las operaciones aritméticas.

Operaciones con decimales en COBOL

Para los números decimales tenemos que añadir donde vaya el punto decimal una V al PICTURE. Esto tiene que estar de forma coherente.

Si creas dos variables como estas, con dos dígitos enteros y dos dígitos decimales. El PICTURE donde se almacene el resultado de la operación, también debe tener aparte de los números enteros, los dos decimales, ni uno menos, ya que si haces esto, se pierden los decimales:

Código COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo15.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables de números.
       01 Numero1 PIC 99V99 VALUE 10.55.
       01 Numero2 PIC 99V99 VALUE 65.20.
      *> Variable para almacenar el resultado.
       01 Resultado PIC 9999 VALUE ZERO.
       PROCEDURE DIVISION.
       MuestraResultado.
           DISPLAY Resultado.
       STOP RUN.

       END PROGRAM Capitulo15.

terminal Resultado en la consola terminal

Esto devuelve un valor entero y perdemos el valor decimal.

0075

Lo correcto, es cambiar el PICTURE de la variable Resultado:

Código COBOL

01 Resultado PIC 99V99 VALUE ZERO.

terminal Resultado en la consola terminal

75.75

Números decimales negativos en COBOL

Vamos a combinar también números decimales con la posibilidad de tener valor negativo. Para eso utilizamos el PICTURE S.

Esta S no tiene porqué ponerse en las variables de números, ya que el resultado de una resta podría devolver un número negativo, solo lo queremos en Resultado.

En este caso, es una suma y devuelve un número positivo:

Código COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo15.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables de números.
           01 Numero1 PIC 99V99 VALUE 10.55.
           01 Numero2 PIC 99V99 VALUE 65.20.
      *> Variable para almacenar el resultado.
           01 Resultado PIC S99V99 VALUE ZERO.
       PROCEDURE DIVISION.
       MuestraResultado.
      *> Calcula el resultado
           COMPUTE Resultado = Numero1 - Numero2.
      *> Muestra el resultado
           DISPLAY Resultado.
       STOP RUN.

       END PROGRAM Capitulo15.

En este caso, es una suma y devuelve un número positivo:

terminal Resultado en la consola terminal

+75.75

Si ponemos una resta, el resultado de 10.55 - 65.20 nos da un número negativo.

Código COBOL

COMPUTE Resultado = Numero1 - Numero2.

terminal Resultado en la consola terminal

-54.65

Cambiar el punto decimal por coma en COBOL

Por si no lo recuerdas, cuando hablé de las divisiones, hablé por encima de la posibilidad de cambiar los puntos decimales por comas decimales.

Si te fijas el punto del decimal puede crear algo de confusión al ser igual que el punto que finaliza el párrafo. Quizás quieras cambiar esto. Para hacerlo, añade la sección CONFIGURATION SECTION y el párrafo SPECIAL-NAMES al programa.

Código COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo15.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
      *> Especificamos que el punto decimal es una coma.
           DECIMAL-POINT IS COMMA.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
      *> Variables de números.
           01 Numero1 PIC 99V99 VALUE 10,55.
           01 Numero2 PIC 99V99 VALUE 65,20.
      *> Variable para almacenar el resultado.
           01 Resultado PIC S99V99 VALUE ZERO.
       PROCEDURE DIVISION.
       MuestraResultado.
      *> Calcula el resultado.
           COMPUTE Resultado = Numero1 - Numero2.
      *> Muestra el resultado.
           DISPLAY Resultado.
       STOP RUN.

       END PROGRAM Capitulo15.

Acuérdate de esto, porque ahora, los puntos aún estando en un número van a funcionar como final de instrucción.

Como curiosidad con los puntos para finalizar frases (instrucciones), si ponemos más de uno, OpenCobolIDE nos va a dar un warning de punto redundante, no obstante, no hace fallar al compilador. Aquí tienes un ejemplo:

Código COBOL

01 Numero1 PIC 99V99 VALUE 10,55.....
Ignoring redundant '.' (ignorando los puntos redundantes).