Netzprogrammierer.de

Mit JavaScript auf beliebige Dezimalstellen runden

Auf Dezimalstellen Runden mit JavaScript

Oft steht man vor dem Problem, das man einen bestimmten Wert auf eine, oder mehrere Dezimalstellen genau runden muss. Viele Programmiersprachen bringen von Haus aus Funktionen mit, die dies Bewerkstelligen, JavaScript gehört leider nicht dazu.

Ganzzahlen Runden mit dem JavaScript – Math Objekt

In Javscript gibt es lediglich die Möglichkeit einen Wert auf eine Ganzzahl zu runden. Aus 1.5 wird beispielsweise eine 2, aus 1.49 eine 1. Zu diesem Zweck stellt das „Math“ Objekt die .round – Methode zur Verfügung. Diese rundet einen Doublewert auf einen Integerwert. Der Aufruf sieht wie folgt aus:

Math.round(Wert);

Als einziger Parameter wird die Dezimalzahl als Wert übergeben.

Math.round(0.5);
gibt beispielsweise 1 zurück.

Eine Möglichkeit auch die Rundungsgenauigkeit, bzw. die Stellen hinterm Komma anzugeben auf die gerundet werden soll gibt es leider nicht.

Eine eigene JavaScript Funktion zum Runden auf Dezimalstellen

Abhilfe schafft eine eigene Implementation, eine Rundenfunktion die sowohl den zu rundenden Wert, als auch die Rundungsgenauigkeit als Parameter erhält.

function round(wert, dez) {

}

Hierbei ist „wert“ wieder die zu rundende Zahl, „dez“ die Anzahl Dezimalstellen auf die gerundet werden soll.

Als erstes sollten die übergebenen Parameterwerte validiert werden. Als erstes prüfen wir ob der Parameter „wert“ eine gültige Zahl ist. Zu diesem Zweck wandeln wir den Wert mittels der JavaScript Funktion parseFloat() in eine Fließkommazahl um. Sollte keine Zahl, sondern eine Zeichenkette übergeben worden sein, die sich nicht in einen Float-Wert umwandeln lässt, gibt parseFoat NaN (Not a Number) zurück. In diesem Fall brechen wir die Funktion ab und geben einfach den Wert 0 zurück:

function round(wert, dez) {
        wert = parseFloat(wert);
        if (!wert) return 0;

}

Nun kümmern wir uns um die Genauigkeit. Der Parameter „dez“ sollte eine Ganzzahl enthalten, die die Anzahl Stellen angibt, auf die der Wert in „wert“ gerundet werden soll. Mit parseInt() wandeln wir den Übergebenen Parameter in einen Integer um. Auch hier wird NaN zurück gegeben, sollte der Wert sich nicht in eine Ganzzahl verwandeln lassen. In diesem Fall setzen wir den Wert einfach auf 0. Dieses Vorgehen macht den Parameter „dez“ auch zu einem optionalem Parameter. Sollte beim Funktionsaufruf kein „dez“ Parameter angegeben werden wird einfach 0 angenommen. Unsere Funktion verhält sich dann so wir die round Methode des Math Objekts:

function round(wert, dez) {
        wert = parseFloat(wert);
        if (!wert) return 0;

        dez = parseInt(dez);
        if (!dez) dez=0;

}

Der Trick beim Runden auf Dezimalstellen

Jetzt fehlt noch das Kernstück in unserer JavaScript Runden Funktion. Um ein Runden auf Nachkommastellen zu ermöglichen bedienen wir uns eines kleinen, mathematischen Tricks. Da JavaScript nur die Möglichkeit bietet auf Ganzzahlen zu runden, rechnen wir unseren Wert einfach um.
Wenn beispielsweise der Wert 1.467 auf zwei Nachkommastellen gerundet werden soll, multiplizieren wir ihn zunächst mit 10², also 100:

1.467 * 100 = 146.7

Das Komma verschiebt sich um zwei Stellen nach rechts. Diesen Wert runden wir nun mit der Math.round() Methode auf eine Ganzzahl und dividieren diese dann wieder durch 100:

Math.round(146.7) = 147
147 / 100 = 1.47

Das Dezimaltrennzeichen verschiebt sich wieder 2 Stellen nach links. Als Ergebnis erhalten wir den auf 2 Stellen gerundeten Ausgangswert.

Die vollständige JavaScript runden Funktion

In unserer Funktion sieht das folgendermaßen aus. Zunächst berechnen wir den Umrechnungsfaktor, anhand der mitgegebenen Genauigkeit, also 10 hoch „dez“. Zum Hochrechnen bietet das JavaScript Math Objekt eine eigene, die .pow Methode an:

var umrechnungsfaktor = Math.pow(10,dez);

Mit diesem Aufruf wird Der Wert 10 mit dem Wert dez hochgerechnet.
Anschließend rufen wir die Math.round() Methode auf und geben den Wert, multipliziert mit dem Umrechnungsfaktor mit. Das Ergebnis teilen wir dann wieder durch den Umrechnungsfaktor und geben das Ganze mit return zurück.

In einer Zeile zusammengefasst sieht das dann so aus:

return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;

Die komplette Funktion:

function round(wert, dez) {
        wert = parseFloat(wert);
        if (!wert) return 0;

        dez = parseInt(dez);
        if (!dez) dez=0;

        var umrechnungsfaktor = Math.pow(10,dez);

        return Math.round(wert * umrechnungsfaktor) / umrechnungsfaktor;
}

Aufgerufen wird die Funktion dann ganz einfach so:

ungerundet = 1.464;
gerundet1 = round(ungerundet, 1); //Rundet auf eine Stelle: 1.5
gerundet2 = round(ungerundet, 2); //Rundet auf zwei Stellen: 1.46