如何在 RPGLE Fixed 或自由格式中声明小数位?

How to declare Decimal place in RPGLE Fixed or in free format?

我对RPGLE了解不多。我正在尝试解决给我的这个小练习。我从未工作过或看过使用小数的练习。我想获得 7 个值的百分比。所以,我想做下面的计算。

例如RPGLE。

DTotal            S              3P 0       
DPercnt           S              2P 2       
 /Free
   Total = 589;
   Percnt = (Total/700)100;
   Dsply Percnt;
   *Inlr = *On;
 /End-Free

预期输出为 84.142857143 或小数点四舍五入到两位 (84.14) 或四位 (84.1430)

  1. 我应该为 TotalPercent 变量使用哪种数据类型?
  2. 如何声明 Percent 变量(打包或分区)以保留两位或四位或 N 位小数?
  3. 请问谁能在《RPG IV》或Fixed format中输入声明部分和计算部分?

我遇到的错误和我进行的更正:

  1. The end of the expression is expected.(在 SEU 中)

    上面的错误,我加了*,解决了Percnt = (Total/700) * 100;

  2. 下面是第二个错误。

    The target for a numeric operation is too small to hold the result (C G D F)
    

    对于上述错误,我将 Percnt 变量长度增加到 4P 2

  3. 但是这次答错了,DSPLY 8414。不符合预期。

    所以,我按照下面的建议使用了 EvalEval(H) Percnt = (Total/700) * 100;

  4. 仍然是相同的输出:DSPLY 8414.

    谢谢@Barbara。我很晚才注意到这个提示DSPLY (%CHAR(Percnt)) 给了我想要的输出 84.14.

RPG 数值变量由总位数和小数位数定义。所以如果你想要两个整数位和两个小数位(12.34),定义变量为 packed(4:2) in free-form 或者 4P 2 in fixed form.

如果要舍入,请为操作码编写 (H) 扩展符('H' 代表“half-adjust”)。赋值的操作码是 EVAL 操作码,通常被省略。但是如果你想添加一个扩展器,你必须编码它。

DTotal            S              3P 0       
DPercnt           S              4P 2       
   Total = 589;
   Eval(H) Percnt = (Total/700) * 100;
   DSPLY (%CHAR(Percnt));
   *Inlr = *On;

除非您使用的是 7.1 之前的版本,否则您不需要再编写 /FREE 和 /END-FREE。