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
DIVvient 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);