Отображать двойное число в 2 знаках после запятой в RPG?

При объявлении переменной с плавающей запятой я не понимаю, какая точность требуется для хранимого объекта в RPG ??

В моем упражнении я ввожу количество копий, например, значение 5.

введите здесь описание изображения

Общая сумма составляет 0,50 евро, но у меня есть сообщение:

введите здесь описание изображения

Я не понимаю, как правильно объявить переменную total в double.

 H
 D NumberCopy      S              3S 0
 D Total           S              ???
  *
  /Free
    dsply 'Enter your copy number please : ' '' NumberCopy;

    If (NumberCopy < 11);
       Total = NumberCopy * 0.10;

    ElseIf (NumberCopy < 31);
       Total = (10 * 0.10) + (NumberCopy - 10) * 0.09;

    Else;
       Total = (10 * 0.10) + (20 * 0.09) + (NumberCopy - 30) * 0.08;

    EndIf;


    dsply ('The amount is of ' + %Char(Total) + ' euros');


    *inlr = *on;
  /End-Free

Вот это я нахожу на RPGPDM.

D Float1          S              8F 

https://www.rpgpgm.com/2014/02/defining-variables-in-rpg-all-free.html


person juliette    schedule 20.12.2020    source источник
comment
И поскольку вы только начинаете изучать RPG, почему бы не изучить ** БЕСПЛАТНУЮ RPG вместо сочетания фиксированной и бесплатной. Вместо D Float1 S 8F напишите dcl-s Float1 float(8);   -  person Mihael    schedule 24.12.2020


Ответы (2)


чтобы сказать это в начале упражнения НЕ ИСПОЛЬЗУЙТЕ ПЛАВАНИЕ В РПГ. Это сделает вас очень несчастным. Чтобы ответить на ваш вопрос: dcl-s total float(8); У вас есть две проблемы с поплавком:

  1. Вы не хотите, чтобы ваши клиенты получали неправильные счета из-за проблем с точностью, как в 1990 году.
  2. Десятичные числа также могут использовать аппаратную поддержку для более быстрой оценки, что не важно, но приятно иметь.

Если вы хотите отобразить поплавок, вы можете сделать что-то подобное

dcl-s outputString char(10) inz;
dcl-s total float(8) inz (5);

outputString = %char(%dec(total: 10: 2));
dsply outputString;

Некоторые подсказки:

  • Не используйте /free или /end-free, компилятор может признать это самостоятельно.
  • Не используйте объявления фиксированного формата для определения ваших полей. Их труднее читать, и нет реальной причины их использовать.
person iiSiggi    schedule 03.03.2021

Вы объявили Float1 двойным. Но проблема в том, что числа с плавающей запятой не являются хорошим выбором для чисел с фиксированной десятичной точностью. См. https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems .

Вы должны использовать packed или zoned, если вы работаете с числами, где требуется правильная точность, а не просто какое-то приближение.

person Mihael    schedule 20.12.2020