在RPG中显示两位小数?

Display double in 2 decimal places in RPG?

在声明浮点变量时,我不明白 RPG 中存储对象需要多少精度??

在我的练习中,我输入了份数,例如值 5

总金额是0.50欧元但是我有喜欢的留言:

我不明白如何在 double 中正确声明变量 total

 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

您已将 Float1 声明为“双精度”。但问题是浮点数不是固定小数精度数字的好选择。参见 https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems

如果您处理的数字需要正确的精度,而不仅仅是某种近似值,则应使用 packed 或 zoned。

在你的练习开始时说,不要在 RPG 中使用 FLOAT。这会让你很不开心。回答你的问题:dcl-s total float(8);你有两个关于浮动的问题:

  1. 您不希望您的客户因为 1990 年那样的准确性问题而收到错误的发票。
  2. Decimals 也可以使用硬件支持来更快地求值,这并不“重要”但很不错。

如果你想显示一个浮动,你可以做类似的事情

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

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

一些提示:

  • 不要使用 /free 或 /end-free 编译器能够自行识别。
  • 不要使用固定格式声明来定义您的字段。它们更难阅读,没有实际理由使用它们。