Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Calculs

MVR

Récupérer le reste d'une division

Place dans la zone résultat le reste de la division DIV qui précède immédiatement.

Syntaxe

     C           dividen   DIV  diviseur  quotie  30
     C                     MVR            reste   30
Facteur 1 (18-27)
Toujours vide.
Facteur 2 (33-42)
Toujours vide.
Zone résultat (43-48)
Reçoit le reste : dividende − (quotient × diviseur), le quotient étant celui que DIV vient de ranger dans sa zone (donc après troncature).
Longueur (49-51)
Longueur totale de la zone résultat, décimales comprises. Renseignée quand la zone apparaît pour la première fois dans le programme : c'est ce qui la définit. Sans longueur, une zone encore inconnue provoque QRG7030, « La zone ou l'indicateur n'est pas défini ».
Décimales (52)
Nombre de décimales de la zone résultat ; 0 pour un entier.
Effet
La zone résultat contient le reste de la division qui précède. Le reste dépend des décimales du quotient : avec un quotient entier il peut avoir des décimales, avec un quotient à décimales il est quasi nul.

À quoi ça sert

Le reste sert à découper : minutes en heures et minutes, articles en cartons et unités, parité d'un numéro. DIV donne la partie entière, MVR ce qui reste.

Exemple 1 : 135 minutes en heures et minutes

     H*  MVR : reste de la division juste apres DIV
     C                     Z-ADD135       MINUTE  50
     C           MINUTE    DIV  60        HEURE   30
     C                     MVR            RESTE   30
     C           'Heures'  DSPLY
     C           HEURE     DSPLY
     C           'Minutes' DSPLY
     C           RESTE     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Heures
  2
Minutes
 15

MINUTE DIV 60 HEURE range 2 (zone sans décimale), puis MVR donne 135 − 2 × 60 = 15 : « 2 h 15 ».

Exemple 2 : Le reste dépend du quotient

     H*  MVR : reste a decimales; le reste depend du quotient
     C                     Z-ADD10.5      NB      52
     C           NB        DIV  4         QUOT    50
     C                     MVR            RESTE   52
     C           'Quotient'DSPLY
     C           QUOT      DSPLY
     C           'Reste'   DSPLY
     C           RESTE     DSPLY
     C           NB        DIV  4         QUOTD   52
     C                     MVR            RESTED  52
     C           'Quot dec'DSPLY
     C           QUOTD     DSPLY
     C           'Reste'   DSPLY
     C           RESTED    DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Quotient
    2
Reste
  250
Quot dec
  262
Reste
    2

10,50 ÷ 4 = 2,625. Avec un quotient sans décimale (2), le reste est 10,50 − 2 × 4 = 250 (2,50). Avec un quotient à 2 décimales (262, soit 2,62), le reste n'est plus que 10,50 − 2,62 × 4 = 2 (0,02).

Le piège

MVR doit suivre le DIV sans rien entre les deux. Une autre opération intercalée (Z-ADD), un MVR après un MULT ou sans DIV du tout, sont refusés : QRG5019, « L'opération MVR est incorrecte. La spécification n'est pas prise en compte ».

Pas de H sur le DIV précédent. Avec DIV et H en colonne 53, le même message QRG5019 est donné sur le MVR : un quotient arrondi n'a pas de reste exploitable.

En RPG ILE full free

En RPG ILE full free, %DIV et %REM donnent quotient et reste sans contrainte d'ordre.

heure = %div(minute: 60);
reste = %rem(minute: 60);