Aller au contenu

%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.