
Envoyé par
SergioMaster
Bonjour,
Les champs de type DECIMAL sont quand même stocké de façon "approximative" par exemple 12.45 sera peut être stocké comme 12.4499999
ou 12.4500001, je n'ai jamais vérifié ce qu'il en était pour les NUMERIC
Et bien non !!!
S'il existe un type NUMERIC dans SQL c'est justement parce que l'encodage des valeurs en binaire dans du flottant laisse des erreurs d'écarts d'arrondi en base 10.
Par exemple 0,2 en base 10 s'écrit
0,001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011...
C'est à dire une suite infinie de décimales binaires...
Malheureusement les ordinateurs étant des machines finies elles arrêtent les calcul sur la longueur du mot du processeurs (32 bits ou 64 bits. Dans notre cas :
0,0011001100110011001100110011001100110011001100110011001100110011
Ceci provoque une très légère erreur qui peut se répercuter dans les calculs.
En revanche le DECIMAL ou le NUMERIC (types normalisés en SQL) sont encode en DBC (Decimal Codé Binaire) c'est à dire en fait sur deux entiers dont l'un donne la précision (nombre de chiffres significatifs) et l'autre l'échelle (c'est à dire la position de la décimale). De ce fait il n'y a jamais d'erreur de calcul, à la précision soihaitée.
Par exemple pour un DECIMAL(16,2), le binaire correspondant est codé de la manière suivante :
Cet ensemble de deux nombres est d'ailleurs appelé "cohorte" dans la norme IEEE 754.
Le premier chiffre est 20 en décimal et le second 2. À l'affichage on positionne alors la virgule après le 2e chiffre en partant de la droite et en remontant. Le chiffre affiché est donc
ou pour certains afficheur
Au moins si vous lisiez mes bouquins sur SQL, vous n'écriveriez pas de telles inepties !
A +
Partager