Div(H) 和 Eval(H) 给出不同的结果

Div(H) and Eval(H) gives different results

我在两个不同的程序中使用来自相同文件的数据。我试图在我的新程序中使用 Eval(H) 而不是 MULT 和 DIV(H)

的两个操作来获得相同的结果

变量类型如下:

Var1,Var3,Var4,Var5 : 9P 2
Var2                : 9P 4

原代码:

C     Var1           MULT      Var2           Var3
C     Var3           DIV(H)    Var4           Var5

在我的新程序中,我尝试了这个:

C                    Eval(H)   Var5 = (Var1 * Var2) / Var4

但是有 .01 的差异,即:在第一种方法中 Var5 = 4.20,在第二种方法中 Var5 = 4.19。

知道如何仅使用 Eval(H) 来更正第二种方法吗?

如果没有实际值,说明起来有点困难,但您可能 运行 遇到 RPG 默认精度规则的问题以及您已经从明确定义的中间结果(即 Var3 ) 到一个隐式定义的。

使用隐式定义的中间结果,(Var 1 * Var2) 的精度和小数位数将为 18P6,而 Var3 定义为 4P2。

整个语句的 "natural" 精度和比例类似于 63P44(假设我的数学计算正确)。

尝试

eval(h) var5 = %dec((var1 * Var2):9:2) / var4;

将中间结果强制返回到您使用 MULT & DIV

得到的 9P2

当您使用 DIV 时,您可以定义任何中间变量(如 VAR3)的长度。当您使用 EVAL 时,编译器必须将这些中间值(例如 VAR1 * VAR2)存储在某处,并在内部定义长度。 RPG Reference 手册描述了编译器用来计算中间结果精度的规则。 IBM i 7.2 > 编程 > ILE 语言 > RPG > ILE RPG 参考 > 运算、表达式和函数 > 表达式 > 数字运算的精度规则。