JavaScriptsMathematik

Fakultät berechnen

Berechnet die Fakultät einer Zahl — also 1 · 2 · 3 · … · n — und schreibt das Ergebnis direkt auf die Seite.

Dieses Script von Valentin Hammer berechnet die Fakultät einer Zahl. Die Fakultät von 5 — geschrieben 5! — ist das Produkt aller ganzen Zahlen von 1 bis 5, also 1 · 2 · 3 · 4 · 5 = 120. Gebraucht wird sie vor allem in der Kombinatorik: n! gibt an, auf wie viele verschiedene Arten sich n Dinge anordnen lassen. Fünf Bücher lassen sich also auf 120 verschiedene Weisen ins Regal stellen.

Tragt einfach eine ganze Zahl ins Feld ein und klickt auf „Fakultät berechnen" — das Ergebnis erscheint direkt darunter. Anders als bei diesem Javascript zur Fakultätsberechnung erfolgt die Ausgabe nicht über ein Meldungsfenster, sondern auf der Seite selbst.

Eine Besonderheit ist die Wachstumsgeschwindigkeit: Fakultäten werden extrem schnell sehr groß. 10! sind noch überschaubare 3.628.800, 20! hat schon 19 Stellen. Ab 19! übersteigt das Ergebnis den Bereich, in dem JavaScript ganze Zahlen exakt speichern kann — von da an sind die hinteren Stellen gerundet, und das Script gibt die Zahl in der wissenschaftlichen Schreibweise mit e+ aus. Ab 171! ist endgültig Schluss, dann meldet das Script, dass die Zahl zu groß geworden ist. Per Definition gilt übrigens 0! = 1 — auch das rechnet das Script korrekt.

Wer mit Fakultäten weiterrechnen will, findet im selben Fach passende Nachbarn: Das Pascalsche Dreieck und die Binomialverteilung bauen auf Binomialkoeffizienten auf, die sich aus Fakultäten zusammensetzen. Eine andere berühmte schnell wachsende Zahlenreihe berechnet die Fibonacci-Reihe.

Mathematik Baujahr 2009 läuft in deinem Browser

Ab 19! kann JavaScript die hinteren Stellen nur noch runden, ab 171! ist die Zahl zu groß für den Rechner.

Eingesandt von Valentin Hammer

So funktioniert das Script

Das Script tut drei Dinge: Es liest die eingegebene Zahl, multipliziert in einer Schleife alle Zahlen von 1 bis zu dieser Zahl auf, und schreibt das Ergebnis in die Ausgabefläche. Alles steckt in einer sofort ausgeführten Funktion, damit die Namen darin nicht mit anderen Scripts auf der Seite kollidieren.

const fakultaetzahl = parseInt(document.getElementById("fb-zahl").value, 10);

parseInt() macht aus dem eingetippten Text eine ganze Zahl und schneidet Nachkommastellen ab — für Fakultäten genau richtig, denn zwischen 4! und 5! gibt es nichts. Die 10 als zweites Argument bedeutet „lies die Zahl im Zehnersystem"; ohne sie könnte parseInt in alten Browsern eine mit 0 beginnende Eingabe als Oktalzahl deuten.

if (isNaN(fakultaetzahl) || fakultaetzahl < 0) {
  ausgabe.textContent = "Bitte tragt eine ganze Zahl ab 0 ein.";
  return;
}

isNaN() steht für „is Not a Number" und erkennt ein leeres oder unsinniges Feld. Zusätzlich werden negative Zahlen abgefangen, denn für sie ist die Fakultät nicht definiert — die Schleife würde einfach gar nicht laufen und stillschweigend 1 ausgeben. return beendet die Funktion an dieser Stelle.

let berechneteFakultaet = 1;
for (let i = 1; i < fakultaetzahl + 1; i++) {
  berechneteFakultaet = berechneteFakultaet * i;
}

Das ist das Herz des Scripts. Die Variable berechneteFakultaet startet bei 1 und sammelt das Produkt ein — man nennt so etwas einen Akkumulator. Die for-Schleife zählt i von 1 hoch, solange i kleiner als fakultaetzahl + 1 ist, also bis einschließlich der eingegebenen Zahl. Bei jedem Durchlauf wird der bisherige Wert mit i multipliziert: aus 1 wird 1, dann 2, dann 6, dann 24 … Für die Eingabe 0 läuft die Schleife kein einziges Mal, und es bleibt bei der 1 — genau das ist die mathematische Definition von 0!. Wichtig ist, dass berechneteFakultaet innerhalb der Funktion mit let angelegt wird: Im Original stand sie außerhalb und musste am Ende von Hand wieder auf 1 zurückgesetzt werden, sonst hätte der zweite Klick ein falsches Ergebnis geliefert.

if (!Number.isFinite(berechneteFakultaet)) {
  ausgabe.textContent = fakultaetzahl + "! ist zu groß — mehr als 170! kann JavaScript nicht darstellen.";
  return;
}

Ab 171! wird das Produkt größer als die größte Zahl, die JavaScript kennt; das Ergebnis ist dann Infinity. Number.isFinite() prüft genau das ab, damit statt eines rätselhaften „Infinity" ein erklärender Satz erscheint.

const anzeige = Number.isSafeInteger(berechneteFakultaet)
  ? berechneteFakultaet.toLocaleString("de-DE")
  : String(berechneteFakultaet);

Hier wird entschieden, wie die Zahl aussehen soll. Number.isSafeInteger() ist wahr, solange die ganze Zahl exakt gespeichert werden kann — das gilt bis 18!. In diesem Fall setzt toLocaleString("de-DE") deutsche Tausenderpunkte, aus 3628800 wird also 3.628.800. Darüber wären Tausenderpunkte eine Vortäuschung von Genauigkeit, die gar nicht mehr besteht; deshalb wird die Zahl dann unverändert in der wissenschaftlichen Schreibweise ausgegeben, etwa 1.5511210043330986e+25. Das ?…:… dazwischen ist die Kurzform einer if-Abfrage.

Zum Anpassen: Die Vorbelegung des Feldes steckt im value-Attribut. Wollt ihr statt der Fakultät die Summe 1+2+3+… berechnen, ersetzt ihr in der Schleife das * durch ein + und den Startwert 1 durch 0. Und wer eine Obergrenze setzen möchte, damit niemand versehentlich riesige Zahlen erzeugt, ergänzt die Prüfung oben um || fakultaetzahl > 100.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Mathematik