6
votes

JavaScript multipliant de manière incorrecte, provoquant un arrondissement incorrect

Lorsque je tire les valeurs que je veux multiplier, ce sont des cordes. Donc, je les tire, les analyser comme flotte (pour préserver les décimales) et les multiplier ensemble. XXX

Cela a fonctionné pour 99% de mes factures, mais j'ai découvert un problème très étrange.

quand il est multiplié: 78 * 7 * 0.0725

JavaScript retourne: 39.5849999999999994

Quand Vous faites normalement les mathématiques dans une calculatrice: 39.585

Quand tout est dit et fait, je prends ce numéro et arrondi à l'aide de .tofixed (2)

Parce que JavaScript retourne ce numéro, il n'est pas arrondi à la valeur souhaitée de: 39,59 $

J'ai essayé Math.Round () le total mais j'ai toujours le même numéro.

J'ai pensé à arrondir le nombre à 3 décimales alors deux, mais cela me semble hacrain.

J'ai cherché partout et que tout ce que je vois, c'est que les gens mentionnent Paysfloat perd sa précision et d'utiliser .tofixed, mais dans l'exemple ci-dessus, cela n'aide pas.

ici est Mon script de test J'ai fait recréer le problème: xxx


4 commentaires

3 Réponses :


6
votes

Les points flottants sont représentés en binaire, pas décimal. Certains nombres décimaux ne seront pas représentés avec précision. Et malheureusement, puisque JavaScript n'a qu'une classe de nombres, ce n'est pas un très bon outil pour ce travail. D'autres langues ont des bibliothèques décimales décentes conçues pour éviter avec précision ce type d'erreur. Vous allez avoir à accepter des erreurs d'une centime, implémenter une solution du côté serveur ou travailler très fort pour résoudre ce problème.

EDIT: OOH! Vous pouvez faire 78 * 7 * 725, puis diviser par 10000, ou être encore plus précis, il suffit de mettre le point décimal au bon endroit. Fondamentalement représenter le taux d'imposition comme autre chose qu'une infime fraction. Moins pratique mais ça va probablement prendre soin de vos erreurs de multiplication.


2 commentaires

Bonne, je jouais toujours avec ma console JavaScript arriver au même point. Plutôt que NUM1, NUM2, etc. Je l'ai trouvé plus clair de dire Quantité = 78; prix = 7; Taxrate = 7,25; Total = (Quantité * Prix * Taxrate) / 100; ... Je pensais que cela ait plus clair le taux de pourcentage et divisez de 100 au lieu de 10 000.


Est probablement. Vous devriez aller là-bas, car les taux d'imposition américaine toujours (AFAIK) tombent sur des quartiers d'un point de pourcentage, ce qui signifie que si vous les représentez en pourcentages, vous pouvez les représenter parfaitement en tant que flotteurs.



1
votes

Vous trouverez peut-être le comptabilité.js bibliothèque utile pour cela. Il a une méthode "améliorée" toofixed ().


0 commentaires

0
votes

JavaScript / TypeScript n'a qu'une seule classe de nombres qui n'est pas si bon. J'ai le même problème que j'utilise dactylography. J'ai résolu mon problème en utilisant Bibliothèque de décimal.js-Light . xxx


0 commentaires