Homepage de.comp.lang.javascript
Homepage
de.comp.lang.javascript

FAQ de.comp.lang.javascript

FAQ
de.comp.lang.javascript

 

 

Bitte verwenden Sie als Einstiegsadresse in diese FAQ die Homepage der Newsgroup de.comp.lang.javascript. Der Aufenthaltsort dieser Seiten hier kann sich ohne Vorwarnung ändern.
 

 

Wie kann ich Zahlen runden und ausgeben?

Inhalt der Seite "Kann mein Browser nicht korrekt rechnen?":
Einleitung: Ungenaues Ergebnis einer einfachen Rechenoperation
Kleiner Exkurs: Dezimal- und Binärsystem
Wie kommt es zu den Rechenfehlern unter JavaScript?
Ungenaue Ergebnisse immer runden?
 
Inhalt dieser Seite:
Runden von Zahlenwerten für die Ausgabe
Kaufmännische Rundung
Dezimalkomma statt Dezimalpunkt
Null vor dem Komma ergänzen
 

Runden von Zahlenwerten für die Ausgabe

Anders als ihre Entsprechungen in manchen anderen Programmiersprachen kennt die Methode Math.round() keinen Parameter für die Stelle, an der gerundet werden soll: das Ergebnis ist immer eine ganze Zahl. Um eine Zahl auf eine bestimmte Anzahl Nachkommastellen zu runden, müssen wir zuerst das Komma nach rechts verschieben (Multiplikation mit einer Zehnerpotenz), dann auf eine ganze Zahl runden und anschließend das Komma wieder an seine ursprüngliche Stelle bringen (Division durch dieselbe Zehnerpotenz). Für beispielsweise 4 Nachkommastellen sieht das so aus:

x = 0.8154711; alert(Math.round(x * 10000) / 10000); Test

Ein Problem kann es dabei aber sein, wenn als Ergebnis der Rundung weniger Nachkommastellen ausgegeben werden als eigentlich gewüscht:

x = 0.8000456; alert(Math.round(x * 10000) / 10000); Test

Eine Methode, die einen Zahlenwert in einen String mit festgelegter Formatierung umwandelt, fehlt in JavaScript. Wir müssen uns daher selbst eine Funktion schreiben, die einen Zahlenwert auf n Stellen rundet und gegebenenfalls Nullen am Ende erhält. Diese kann z.B. wie folgt aussehen. Bevor jedoch hier jemand laut protestiert, weise ich schnell noch darauf hin, daß diese Funktion im nächsten Abschnitt dann stark vereinfacht wird ...

function runde(x, n) {
  if (n < 1 || n > 14) return false;
  var e = Math.pow(10, n);
  var k = (Math.round(x * e) / e).toString();
  if (k.indexOf('.') == -1) k += '.';
  k += e.toString().substring(1);
  return k.substring(0, k.indexOf('.') + n+1);
}
x
n
runde(x, n)   Test

Wie funktioniert dies? Wir übergeben der Funktion zwei Parameter (Zeile 1): x ist der zu rundende Wert, n die Anzahl der gewünschten Nachkommastellen. Zunächst überprüfen wir n auf den sinnvollen Wertebereich 1..14: liegt n außerhalb, geben wir false zurück (Zeile 2). Dann berechnen wir den Faktor e zu 10n (Zeile 3) - dies entspricht den 10000 in den beiden Beispielen oben. Die nun folgende Berechnung ist die gleiche wie in diesen beiden Beispielen - nur wandeln wir anschließend das Ergebnis in eine Zeichenkette um (Zeile 4). War das Ergebnis ganzzahlig, fügen wir einen Dezimalpunkt an (Zeile 5). Aus e können wir uns leicht eine Zeichenkette aus n Nullen erzeugen (Zeile 6), diese hängen wir an unser bisheriges Ergebnis an. Alles das können wir zuletzt auf die gewünschte Länge, n Stellen hinter dem Dezimalpunkt, zuschneiden und zurückgeben (Zeile 7).

Seitenanfang

Kaufmännische Rundung

Der häufigste Grund, eine Zahl mit JavaScript zu runden, ist sicherlich die korrekte Ausgabe eines Geldbetrages. Bei dieser sogenannten kaufmännischen Rundung steht die Zahl der Nachkommastellen fest: jede Zahl muß genau zwei Nachkommastellen aufweisen. Wir können die Funktion runde() aus dem letzten Abschnitt daher stark vereinfachen: n ist immer gleich zwei, e daher gleich 100 und die Zeichenkette aus n Nullen gleich "00". Es bleibt nur dies übrig:

function kaufm(x) {
  var k = (Math.round(x * 100) / 100).toString();
  k += (k.indexOf('.') == -1)? '.00' : '00';
  return k.substring(0, k.indexOf('.') + 3);
}
x
kaufm(x)   Test
Seitenanfang

Dezimalkomma statt Dezimalpunkt

Wollen wir statt des Dezimalpunktes ein Dezimalkomma ausgeben, müssen wir die Zeichenkette zerschneiden: Zunächst geben wir alle Zeichen bis zu dem vor dem Punkt aus, dann ein Komma und zuletzt die beiden Zeichen, die auf den Punkt folgen. Die Funktion aus dem letzten Abschnitt, um dies erweitert, sieht dann so aus:

function kaufm(x) {
  var k = (Math.round(x * 100) / 100).toString();
  k += (k.indexOf('.') == -1)? '.00' : '00';
  var p = k.indexOf('.');
  return k.substring(0, p) + ',' + k.substring(p+1, p+3);
}
x
kaufm(x)   Test
Seitenanfang

Null vor dem Komma ergänzen

Netscapes Navigator gibt keine führenden Nullen vor dem Dezimalpunkt aus. Während der Internet Explorer beispielsweise für ein Zehntel "0.1" und für minus ein Fünftel "-0.2" anzeigt, liefert Netscape ".1" und "-.2". Wollen wir die Funktion aus dem letzten Abschnitt noch so ergänzen, daß in diesen Fällen eine Null vor dem Komma ergänzt wird, müssen wir feststellen, ob unsere Zeichenkette mit "." oder mit "-." beginnt - in diesen Fällen wird in der nachstehenden Funktion p gleich null bzw. m gleich null sein (Zeile 4). In diesen Fällen müssen wir, statt eines Kommas, "0," einfügen (Zeile 5). Alles zusammen sieht schließlich so aus:

function kaufm(x) {
  var k = (Math.round(x * 100) / 100).toString();
  k += (k.indexOf('.') == -1)? '.00' : '00';
  var p = k.indexOf('.'), m = k.indexOf('-.');
  var f = (p == 0 || m == 0)? '0,' : ',';
  return k.substring(0, p) + f + k.substring(p+1, p+3);
}
x
kaufm(x)   Test
 

Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/.

Dieser Text wurde erstellt von Dietmar H. G. Meier (©).

 
© S. Mintert, Ch. Kühnel

 ______ letzte Änderung: 12.06.2012 ______