5

Ich versuche, eine Zahl als Prozent anzuzeigen, indem Sie _.round verwenden und dann die Zahl mit 100 multiplizieren. Aus irgendeinem Grund, wenn ich die gerundete Zahl multipliziere, wird die Genauigkeit durcheinander gebracht. Hier ist, wie es aussieht:Lodash Rundungsgenauigkeit

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

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

fiddle

Warum ist die ,000000000000001 der Anzahl hinzugefügt, nachdem mit 100 multipliziert wird?

+0

http://stackoverflow.com/questions/1458633/How-To-Deal-mit-Fließkommazahl-Präzision-in-Javascript –

+0

Danke @JamesDonnelly! –

+0

Bitte geben Sie eine kurze Antwort auf Ihre eigene Frage, @TimPerkins. Der referenzierte Beitrag könnte das Thema abdecken, aber es ist unklar, wie genau. –

Antwort

5

Dies liegt daran, dass Zahlen intern als Binärzahlen mit begrenzter Genauigkeit dargestellt werden.

Siehe


schwimmt gebrochen Punkt Mathe auch?

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

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

Irgendwelche Ideen, warum dies geschieht?

die die Antwort bekam:

Binary floating point Mathe so ist. In den meisten Programmiersprachen basiert es auf der IEEE 754 standard. JavaScript verwendet eine 64-Bit-Gleitkommadarstellung, die mit Java double identisch ist. Der Kern des Problems ist, dass Zahlen in diesem Format als eine ganze Zahl mal eine Potenz von zwei dargestellt werden; rationale Nummern (wie 0.1, die 1/10 ist), deren Nenner keine Potenz von zwei nicht genau dargestellt werden kann.


Um das richtige Ergebnis in Ihrem Fall zu erhalten, müssen Sie nach alle Arithmetik abzurunden:

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>