%DIV
Quotient entier
Renvoie le quotient entier d'une division : la partie entière du résultat, sans reste et sans décimales.
Syntaxe
%DIV(dividende : diviseur)
dividende- Un nombre entier (zone ou expression entière, sans décimales).
diviseur- Un nombre entier, non nul.
- Résultat
- Un entier : le quotient tronqué vers zéro. -17 divisé par 5 donne -3, et non -4.
À quoi ça sert
Dans une expression, l'opérateur / donne un résultat décimal : 17 / 5 vaut 3,4. Pour un quotient entier (nombre de palettes complètes, heures d'une durée en secondes), %DIV le donne directement, avec %REM pour le reste.
Exemple 1 : Secondes en heures, minutes, secondes
**free
// %DIV : quotient entier d'une division (avec %REM pour le reste).
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s duree int(10) inz(9045);
dcl-s heures int(10);
dcl-s minutes int(10);
dcl-s secondes int(10);
dcl-s reste int(10);
// 9045 secondes en heures, minutes, secondes.
heures = %div(duree : 3600);
reste = %rem(duree : 3600);
minutes = %div(reste : 60);
secondes = %rem(reste : 60);
snd-msg '9045 s = ' + %char(heures) + ' h ' + %char(minutes) + ' min ' + %char(secondes) + ' s';
snd-msg '17 / 5 (operateur /) : ' + %char(17 / 5);
snd-msg '%DIV(17 : 5) : ' + %char(%div(17 : 5));
snd-msg '%DIV(-17 : 5) : ' + %char(%div(-17 : 5));
snd-msg '%DIV(17 : -5) : ' + %char(%div(17 : -5));
snd-msg '%DIV(-17 : -5) : ' + %char(%div(-17 : -5));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
9045 s = 2 h 30 min 45 s
17 / 5 (operateur /) : 3.4000000000000000000000000000
%DIV(17 : 5) : 3
%DIV(-17 : 5) : -3
%DIV(17 : -5) : -3
%DIV(-17 : -5) : 3
9045 secondes font 2 heures, 30 minutes et 45 secondes : on prend le quotient par 3600, puis le quotient du reste par 60. Comparez 17 / 5 (résultat décimal 3,4) avec %DIV(17 : 5) (3).
Les négatifs se comportent par troncature vers zéro : -17 / 5 donne -3, 17 / -5 donne -3, -17 / -5 donne 3.
Exemple 2 : Division par zéro
**free
// %DIV : division par zero.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-ds pgmsts psds qualified;
typ char(3) pos(40);
num char(4) pos(43);
end-ds;
dcl-s colis int(10) inz(250);
dcl-s palettes int(10) inz(0);
dcl-s parPalette int(10);
monitor;
parPalette = %div(colis : palettes);
on-error *all;
snd-msg 'Statut ' + %char(%status) + ' ' + pgmsts.typ + pgmsts.num;
endmon;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Statut 102 MCH1211
Un diviseur nul arrête le programme : statut 102, message MCH1211 (« tentative de division par zéro »). Le bloc monitor permet de l'attraper.
Le piège
Ce n'est pas la division « vers le bas » des mathématiques. %DIV(-17 : 5) vaut -3 (troncature vers zéro), pas -4. Deuxième piège : %DIV n'accepte que des entiers ; un dividende comme 17.5 est refusé à la compilation (RNF0551). Enfin, le diviseur nul plante avec MCH1211 : testez-le avant.