Warum es kompliziert ist
JavaScript bietet mit dem Math-Objekt eine Methode zum Runden auf ganze Zahlen. Wenn wir auf eine bestimmte Anzahl von Nachkommastellen runden wollen, dann müssen wir das selbst erledigen. Dieser Beitrag geht nicht auf die Details der Fließkommaarithmetik ein, aber kurz gesagt verwenden die meisten Programmiersprachen eine binäre Fließkommadarstellung, die viele Dezimalbrüche nur annähernd darstellen kann. Dies führt zu Rundungsfehlern bei den gängigsten Ansätzen zum Runden in JavaScript.
Rundungsfehler
Die gängigsten Lösungen zum Runden auf eine Dezimalstelle sind entweder die Verwendung von Number.prototype.toFixed()
, oder die Multiplikation der Fließkommazahl mit einer Potenz von 10, um Math.round()
zu nutzen. Beides funktioniert, nur manchmal wird ein Dezimalwert von 5 abgerundet statt aufgerundet.
Number((1.005).toFixed(2)); // 1 instead of 1.01
Math.round(1.005*100)/100; // 1 instead of 1.01
Eine bessere Lösung
Das Rundungsproblem lässt sich vermeiden, indem man Zahlen in Exponentialschreibweise verwendet:
Number(Math.round(1.005+'e2')+'e-2'); // 1.01
Und um das in etwas Brauchbareres zu abstrahieren:
function round(value, decimals) { return Number(Math.round(value+'e'+decimals)+'e-'+decimals);}round(1.005, 2); // 1.01