5

J'essaie d'afficher un nombre en pourcentage en utilisant _.round et ensuite en multipliant le nombre par 100. Pour une raison quelconque, lorsque je multiplie le nombre arrondi, la précision est foiré. Voici à quoi il ressemble:Lodash arrondissant la précision

var num = 0.056789, 
    roundingPrecision = 4, 
    roundedNum = _.round(num, roundingPrecision), 
    percent = (roundedNum * 100) + '%'; 

console.log(roundedNum); // 0.0568 
console.log(percent); // 5.680000000000001% 

fiddle

Pourquoi le ,000000000000001 ajouté au nombre après avoir multiplié par 100?

+0

http://stackoverflow.com/questions/1458633/how-to-deal-with-nombre-flottant-précision-en-javascript –

+0

Merci @JamesDonnelly! –

+0

Veuillez fournir une réponse succincte à votre propre question, @TimPerkins. Le post référencé pourrait couvrir le sujet, mais on ne sait pas exactement comment. –

Répondre

5

Ceci est dû au fait que les nombres sont représentés en interne sous forme de nombres binaires avec une précision limitée.

Voir aussi


flotte cassé maths point?

0,1 + 0,2 == 0,3 -> false

0,1 + 0,2 -> 0,30000000000000004

Toutes les idées pourquoi cela se produit?

qui a obtenu la réponse:

binaire floating point mathématiques est comme ça. Dans la plupart des langages de programmation, il est basé sur le IEEE 754 standard. JavaScript utilise une représentation en virgule flottante de 64 bits, identique à Java double. Le noeud du problème est que les nombres sont représentés dans ce format comme un nombre entier fois une puissance de deux; les nombres rationnels (tels que 0.1, qui est 1/10) dont le dénominateur n'est pas une puissance de deux ne peuvent pas être exactement représentés.


Pour obtenir le résultat correct dans votre cas, vous devez arrondir après toute arithmétique:

var num = 0.056789, 
 
    roundingPrecision = 4, 
 
    roundedNum = _.round(num * 100, roundingPrecision), 
 
    percent = roundedNum + '%'; 
 

 
console.log(percent); // 5.0569%
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>