Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisez flottant ou décimal pour le montant en dollars de l'application comptable ?

Le type de données Float ou Decimal doit-il être utilisé pour les montants en dollars ?

La réponse est simple. Ne flotte jamais. JAMAIS !

Selon IEEE 754, les flottants étaient toujours binaires, seule la nouvelle norme IEEE 754R définissait les formats décimaux. De nombreuses parties binaires fractionnaires ne peuvent jamais être égales à la représentation décimale exacte.

Tout nombre binaire peut être écrit sous la forme m/2^n (m , n entiers positifs), tout nombre décimal sous la forme m/(2^n*5^n) .Comme les binaires n'ont pas le premier factor 5 , tous les nombres binaires peuvent être exactement représentés par des décimales, mais pas l'inverse.

0.3 = 3/(2^1 * 5^1) = 0.3

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]

          1/4         1/8         1/16          1/32

Vous vous retrouvez donc avec un nombre supérieur ou inférieur au nombre décimal donné. Toujours.

Pourquoi est-ce important? Arrondi.

L'arrondi normal signifie 0..4 vers le bas, 5..9 vers le haut. C'est donc le cas importe si le résultat est soit 0.049999999999 .... ou 0.0500000000 ... Vous savez peut-être que cela signifie 5 centimes, mais l'ordinateur ne le sait pas et arrondit 0.4999 ... vers le bas (faux) et 0.5000 ... en haut (à droite).

Étant donné que le résultat des calculs en virgule flottante contient toujours de petits termes d'erreur, la décision est un pur hasard. Cela devient sans espoir si vous voulez une gestion décimale arrondie à paire avec des nombres binaires.

Pas convaincu ? Vous insistez sur le fait que dans votre système de compte, tout va parfaitement bien ? L'actif et le passif sont égaux ? Ok, alors prenez chacun des nombres formatés donnés de chaque entrée, analysez-les et additionnez-les avec un système décimal indépendant !

Comparez cela avec la somme formatée. Oups, quelque chose ne va pas, n'est-ce pas ?

Pour ce calcul, une précision et une fidélité extrêmes étaient requises (nous avons utilisé Oracle'sFLOAT) afin que nous puissions enregistrer les "milliardièmes de centime" en cours de calcul.

Cela n'aide pas contre cette erreur. Parce que tout le monde suppose automatiquement que l'ordinateur additionne correctement, et pratiquement personne ne vérifie de manière indépendante.