Aller au contenu

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