計算時の端数処理(四捨五入、切捨て、切り上げ)は、業務系ではかかせない処理かと思います。
しかしながら、RPGでは、この基本処理を簡単に記述できない苦悩があります。
いつものように、単に私が知らないだけなのかもしれませんが・・・。
税込み金額の計算を例にサンプルを作ってみました。
サンプル
D MAIN PR EXTPGM('SAMPLE31') D 7P 0 D 3P 2 D MAIN PI D P@AMT1 7P 0 D P@RATE 3P 2 D* D W@TEMP S 7P 2 D W@AMT2 S 7P 0 D* /FREE W@AMT2 = P@AMT1 * P@RATE; // 切捨て DSPLY W@AMT2; EVAL(H) W@AMT2 = P@AMT1 * P@RATE; // 四捨五入 DSPLY W@AMT2; W@TEMP = P@AMT1 * P@RATE; // 切上げ IF W@TEMP >= *ZERO; W@AMT2 = W@TEMP + 0.99; ELSE; W@AMT2 = W@TEMP - 0.99; ENDIF; DSPLY W@AMT2; *INLR = *ON; RETURN; /END-FREE
実行結果
テストケース
18 * 1.08 = 19.44 19 * 1.08 = 20.52
CALL PGM(TIGEROBJ/SAMPLE31) PARM(X'0000018F' X'108F') DSPLY 19 DSPLY 19 DSPLY 20 CALL PGM(TIGEROBJ/SAMPLE31) PARM(X'0000019F' X'108F') DSPLY 20 DSPLY 21 DSPLY 21 CALL PGM(TIGEROBJ/SAMPLE31) PARM(X'0000018D' X'108F') DSPLY 19- DSPLY 19- DSPLY 20- CALL PGM(TIGEROBJ/SAMPLE31) PARM(X'0000019D' X'108F') DSPLY 20- DSPLY 21- DSPLY 21-
このサンプルでは、結果を格納する変数が整数であるため、切り上げ処理では、0.99を加減しています。切り上げする簡単な関数があると助かるのですが・・・。
とはいえ、何度もあちこちに書くような処理ではないので、それほど問題ではありませんね。