タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【AS400】RPGLE-金額計算時の端数処理

計算時の端数処理(四捨五入、切捨て、切り上げ)は、業務系ではかかせない処理かと思います。

しかしながら、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を加減しています。切り上げする簡単な関数があると助かるのですが・・・。
とはいえ、何度もあちこちに書くような処理ではないので、それほど問題ではありませんね。