5

Sto provando a visualizzare un numero in percentuale utilizzando _.round e quindi moltiplicando il numero per 100. Per qualche motivo, quando moltiplico il numero arrotondato, la precisione viene incasinata. Ecco come si presenta:Precisione di arrotondamento Lodash

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

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

fiddle

Perché la 0,000000000000001 aggiunto il numero dopo moltiplicando per 100?

+0

http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript –

+0

Grazie a @JamesDonnelly! –

+0

Fornisci una risposta sintetica alla tua domanda, @TimPerkins. Il post di riferimento potrebbe coprire l'argomento, ma non è chiaro come esattamente. –

risposta

5

Ciò è dovuto al fatto che i numeri sono rappresentati internamente come numeri binari con precisione limitata.

Vedi anche


Is calcoli in virgola mobile rotto?

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

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

Tutte le idee perché questo accade?

che ha ottenuto la risposta:

binario floating point la matematica è come questo. Nella maggior parte dei linguaggi di programmazione, è basato sullo IEEE 754 standard. JavaScript utilizza la rappresentazione in virgola mobile a 64 bit, che è la stessa di Java double. Il nodo del problema è che i numeri sono rappresentati in questo formato come un numero intero moltiplicato per una potenza di due; numeri razionali (come 0.1, che è 1/10) il cui denominatore non è una potenza di due non può essere esattamente rappresentato.


Per ottenere il risultato corretto nel tuo caso, è necessario arrotondare dopo tutto l'aritmetica:

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>