Rpgle 在RPG中显示双精度小数点后2位?

Rpgle 在RPG中显示双精度小数点后2位?,rpgle,rpg,Rpgle,Rpg,声明浮点变量时,我不了解RPG中存储对象所需的精度 在我的练习中,我输入份数,例如值5 总金额为0.50欧元,但我有类似的信息: 我不明白如何用double正确声明变量total H D NumberCopy S 3S 0 D Total S ??? * /Free dsply 'Enter your copy number please : ' '' NumberCopy; I

声明浮点变量时,我不了解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

您已将Float1声明为“double”。但问题是,对于固定十进制精度的数字来说,浮点数并不是一个好的选择。看


如果你使用的数字需要正确的精度,而不仅仅是近似值,那么你应该使用packed或zoned。

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

  • 你不希望你的客户因为1990年那样的准确性问题而收到错误的发票
  • 小数也可以使用硬件支持来更快地评估,这不是“重要”而是一个很好的选择
  • 如果你想显示一个浮动,你可以这样做

    dcl-s outputString char(10) inz;
    dcl-s total float(8) inz (5);
    
    outputString = %char(%dec(total: 10: 2));
    dsply outputString;
    
    一些提示:

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

    既然您刚刚开始学习RPG,为什么不学习**免费RPG,而不是固定和免费的混合。而不是
    D Float1 S 8F
    write
    dcl-S Float1 float(8)
    
    dcl-s outputString char(10) inz;
    dcl-s total float(8) inz (5);
    
    outputString = %char(%dec(total: 10: 2));
    dsply outputString;