%UNSH
Convertir en entier non signé avec arrondi
Comme %UNS, mais la valeur est arrondie à l'entier le plus proche au lieu d'être tronquée.
Syntaxe
%UNSH(expression)
expression- Un nombre, une expression numérique ou une zone caractère contenant un nombre.
- Résultat
- Un entier non signé, arrondi : 12,49 donne 12, 12,50 donne 13. Une valeur négative fait planter le programme.
À quoi ça sert
C'est le pendant non signé de %INTH : on veut un entier positif (un nombre de pièces, de lignes, de jours) et on veut le plus proche, pas un entier coupé.
Exemple 1 : Arrondi, troncature et négatif
**free
// %UNSH : entier non signe ARRONDI, contre %UNS qui tronque.
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 a packed(7:2) inz(12.50);
dcl-s b packed(7:2) inz(12.49);
dcl-s c packed(7:2) inz(-0.40);
snd-msg '12.50 %UNS : ' + %char(%uns(a)) + ' %UNSH : ' + %char(%unsh(a));
snd-msg '12.49 %UNS : ' + %char(%uns(b)) + ' %UNSH : ' + %char(%unsh(b));
monitor;
snd-msg '-0.40 %UNS : ' + %char(%uns(c));
on-error *all;
snd-msg '-0.40 %UNS plante : ' + pgmsts.typ + pgmsts.num;
endmon;
monitor;
snd-msg '-0.40 %UNSH : ' + %char(%unsh(c));
on-error *all;
snd-msg '-0.40 %UNSH plante : ' + pgmsts.typ + pgmsts.num;
endmon;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
12.50 %UNS : 12 %UNSH : 13
12.49 %UNS : 12 %UNSH : 12
-0.40 %UNS plante : MCH1210
-0.40 %UNSH plante : MCH1210
12,50 donne 13 avec %UNSH et 12 avec %UNS ; 12,49 donne 12 dans les deux cas.
Le dernier cas surprend : -0,40 plante avec MCH1210, aussi bien avec %UNS qu'avec %UNSH. Le signe est refusé, quel que soit le résultat de la troncature ou de l'arrondi.
Le piège
Une valeur négative plante, même minuscule. -0,40 serait ramené à 0 par la troncature comme par l'arrondi, mais les deux fonctions s'arrêtent avec MCH1210. Si un solde peut être légèrement négatif, prendre %ABS ou tester le signe avant la conversion.