Aller au contenu

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