%DECH
Convertir en décimal avec arrondi
Comme %DEC, mais la valeur est arrondie au lieu d'être tronquée : 12,5 donne 13 et -12,5 donne -13.
Syntaxe
%DECH(expression : chiffres : décimales)
expression- Une zone caractère contenant un nombre, une zone ou une expression numérique.
chiffres- Nombre total de chiffres du résultat (constante).
décimales- Nombre de décimales du résultat (constante).
- Résultat
- Un nombre décimal empaqueté de la précision demandée. Quand la première décimale supprimée vaut 5 ou plus, la dernière décimale conservée augmente en valeur absolue.
À quoi ça sert
Les calculs commerciaux produisent souvent plus de décimales qu'on n'en affiche : un prix hors taxes multiplié par un taux de TVA, une remise en pourcentage, un taux de change. Il faut arrondir au centime. %DECH le fait à l'endroit précis où on convertit, sans passer par un EVAL(H) à part.
Elle s'utilise aussi sur du texte : %DECH('1.239' : 9 : 2) donne 1,24.
Exemple 1 : Le centime de TVA
**free
// %DECH : comme %DEC, mais la valeur est ARRONDIE (demi vers le haut, en valeur absolue).
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s prixHt packed(9:2) inz(19.99);
dcl-s tva packed(5:4) inz(0.2);
dcl-s ttc packed(9:2);
dcl-s remise packed(9:4) inz(-12.5);
dcl-s texte varchar(10) inz('1.239');
ttc = %dec(prixHt * (1 + tva) : 9 : 2);
snd-msg 'TTC avec %DEC : ' + %char(ttc);
ttc = %dech(prixHt * (1 + tva) : 9 : 2);
snd-msg 'TTC avec %DECH : ' + %char(ttc);
snd-msg 'Brut 19.99*1.2 : ' + %char(prixHt * (1 + tva));
snd-msg '-12.5 %DEC (9:0) : ' + %char(%dec(remise : 9 : 0));
snd-msg '-12.5 %DECH (9:0) : ' + %char(%dech(remise : 9 : 0));
snd-msg 'Texte 1.239 %DEC : ' + %char(%dec(texte : 9 : 2));
snd-msg 'Texte 1.239 %DECH : ' + %char(%dech(texte : 9 : 2));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
TTC avec %DEC : 23.98
TTC avec %DECH : 23.99
Brut 19.99*1.2 : 23.988000
-12.5 %DEC (9:0) : -12
-12.5 %DECH (9:0) : -13
Texte 1.239 %DEC : 1.23
Texte 1.239 %DECH : 1.24
19,99 × 1,2 donne 23,988. Avec %DEC on garde 23,98, avec %DECH on obtient 23,99. Un centime d'écart par ligne, multiplié par des milliers de lignes de facture, ne passe pas inaperçu à la comptabilité.
Pour les négatifs, l'arrondi se fait en valeur absolue : -12,5 donne -13 (et non -12). Même chose pour le texte : '1.239' donne 1,24 avec %DECH et 1,23 avec %DEC.
Le piège
Aucune des deux fonctions n'est « la bonne » par défaut : il faut choisir. Une simple affectation ttc = prixHt * (1 + tva) coupe elle aussi les décimales en trop, sans prévenir (dans l'exemple, la coupure de %DEC donne 23,98 alors que la facture arrondie indique 23,99).
L'arrondi de %DECH est « demi vers le haut en valeur absolue » : 12,5 donne 13, -12,5 donne -13. Ce n'est pas l'arrondi « au pair » des tableurs.