Aller au contenu

%DECPOS

Nombre de décimales

Renvoie le nombre de décimales d'une zone ou d'une expression numérique, tel qu'il est défini par la déclaration.

Syntaxe

%DECPOS(expression numérique)
expression numérique
Une zone ou une expression de type packed, zoned ou entier, ou une constante numérique. Un flottant est refusé à la compilation (RNF0334).
Résultat
Un entier : le nombre de décimales du type de l'expression. Une multiplication additionne les décimales de ses opérandes.

À quoi ça sert

Dans du code générique (une procédure qui reçoit des montants de précisions différentes), il est utile de savoir combien de décimales a une zone. %DECPOS le dit sans avoir à écrire en dur le nombre.

C'est aussi une aide de mise au point : on vérifie combien de décimales un calcul intermédiaire conserve.

Exemple 1 : Décimales des zones et des expressions

**free
// %DECPOS : nombre de decimales d'une zone ou d'une expression numerique.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s prix     packed(9:2) inz(19.99);
dcl-s taux     packed(5:4) inz(0.2055);
dcl-s cumul    zoned(11:3) inz(1500.125);
dcl-s rond     packed(9:2) inz(20);
dcl-s qte      int(10) inz(3);

snd-msg 'prix packed(9:2)   : ' + %char(%decpos(prix));
snd-msg 'taux packed(5:4)   : ' + %char(%decpos(taux));
snd-msg 'cumul zoned(11:3)  : ' + %char(%decpos(cumul));
snd-msg 'qte int(10)        : ' + %char(%decpos(qte));
snd-msg 'rond = 20 (packed 9:2) : ' + %char(%decpos(rond));
snd-msg 'prix * taux        : ' + %char(%decpos(prix * taux));
snd-msg 'prix * qte         : ' + %char(%decpos(prix * qte));
snd-msg 'litteral 12.345    : ' + %char(%decpos(12.345));

// Un test utile : deux zones ont-elles la meme precision ?
snd-msg 'prix et taux de meme precision : ' + %char(%decpos(prix) = %decpos(taux));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

prix packed(9:2)   : 2
taux packed(5:4)   : 4
cumul zoned(11:3)  : 3
qte int(10)        : 0
rond = 20 (packed 9:2) : 2
prix * taux        : 6
prix * qte         : 2
litteral 12.345    : 3
prix et taux de meme precision : 0

Le résultat est fixé par la déclaration, pas par la valeur : rond contient 20 et n'a pourtant aucune décimale utile, il renvoie 2 parce qu'il est déclaré packed(9:2). Un entier renvoie 0. Un produit additionne : 2 + 4 = 6 pour prix * taux, et 2 + 0 = 2 pour prix * qte. La constante 12,345 renvoie 3.

Le piège

Ce n'est pas le nombre de décimales significatives de la valeur, mais celui du type : 20 dans un packed(9:2) renvoie 2, et un produit prix * taux en a 6, même si le résultat n'en a besoin que de quatre.

Deux limites vérifiées à la compilation : un réel est refusé (RNF0334, « le paramètre de %DECPOS est incorrect ») et le résultat de %DECPOS ne peut pas servir de troisième paramètre à %DEC ou %DECH (RNF0329), qui attendent une vraie constante.