Dezimalbruch
Wandelt einen gemeinen Bruch in einen Dezimalbruch um und markiert dabei die Periode samt ihrer Länge.
Unser User Vollautomatisch hat uns ein Script eingeschickt, das einen gemeinen Bruch in einen Dezimalbruch umwandelt — aus 1/8 wird also 0,125. Interessant wird es bei Brüchen, deren Dezimaldarstellung nicht abbricht: Das Script erkennt, ab welcher Stelle sich die Ziffern wiederholen, überstreicht diese Periode und gibt ihre Länge an.
Tragt oben den Zähler und darunter den Nenner ein und klickt auf „Errechnen". Voreingestellt ist 1/97 — ein hübsches Beispiel, denn dieser Bruch hat eine Periode von 96 Stellen und läuft damit fast bis an die theoretische Obergrenze. „Löschen" leert die Felder und die Ausgabe wieder.
Zum Hintergrund: Jeder Bruch aus ganzen Zahlen ergibt entweder eine abbrechende oder eine periodische Dezimalzahl — etwas anderes gibt es nicht. Abbrechend wird es genau dann, wenn im gekürzten Nenner nur die Primfaktoren 2 und 5 stecken, also bei 2, 4, 5, 8, 10, 20, 25 und so weiter; das sind die Teiler der Zehnerpotenzen, mit denen unser Stellenwertsystem arbeitet. In allen anderen Fällen wiederholt sich ein Ziffernblock, und dessen Länge kann höchstens um eins kleiner sein als der Nenner: 1/7 hat sechs Stellen Periode, 1/97 deren 96.
Wenn ihr wissen wollt, welche Primfaktoren in eurem Nenner stecken, hilft euch die Primfaktorzerlegung; zum Kürzen eines Bruchs braucht ihr den größten gemeinsamen Teiler. Alle Teiler einer Zahl auf einmal listet euch Teiler einer Zahl auf.
Die überstrichenen Ziffern sind die Periode — sie wiederholt sich endlos.
So funktioniert das Script
Das Script macht nichts anderes als das, was ihr in der Schule als schriftliche Division gelernt habt — nur eben in einer Schleife. In jedem Durchgang wird eine Ziffer berechnet und der Rest notiert. Der Clou steckt in diesen Resten: Taucht ein Rest zum zweiten Mal auf, muss sich ab dort alles wiederholen, denn aus demselben Rest folgt zwangsläufig dieselbe nächste Ziffer. Genau daran erkennt das Script die Periode.
do {
i++;
ziffern[i] = Math.floor(rest / nenner);
reste[i] = rest % nenner;
anfang = periodeFinden(i, reste);
rest = reste[i] * 10;
} while (reste[i] !== 0 && anfang === 0 && i < MAX_STELLEN);
Das ist der Kern. Math.floor(rest / nenner) liefert den ganzzahligen Anteil der Division — bei 10 geteilt durch 3 also die 3. Der Operator % („Modulo") gibt den Rest dieser Division zurück, hier die 1. Dieser Rest wird mit 10 multipliziert, weil beim schriftlichen Dividieren die nächste Null heruntergeholt wird. Eine do … while-Schleife läuft im Unterschied zur normalen while-Schleife garantiert mindestens einmal durch — praktisch, denn die erste Ziffer (der Anteil vor dem Komma) wird immer gebraucht.
Die Schleife endet aus drei Gründen: Der Rest ist 0 (die Division geht auf), es wurde eine Periode gefunden, oder die Notbremse MAX_STELLEN greift. Die letzte Bedingung ist eine Sicherheitsleine, damit der Browser bei sehr großen Nennern nicht minutenlang beschäftigt ist.
function periodeFinden(i, reste) {
for (let x = 1; x < i; x++) {
if (reste[x] === reste[i]) {
return x;
}
}
return 0;
}
Diese Funktion durchsucht alle bisherigen Reste nach dem aktuellen. Wird sie fündig, liefert sie die Position des früheren Vorkommens zurück, sonst eine 0. Ein return mitten in der Schleife beendet die Funktion sofort — es wird also nicht weiter gesucht, sobald der Treffer da ist. Die 0 als „nichts gefunden" funktioniert hier deshalb sauber, weil die Zählung bei 1 beginnt und 0 damit nie eine echte Position sein kann.
const vorPeriode = ziffern.slice(2, anfang + 1).join("");
const periode = ziffern.slice(anfang + 1, i + 1).join("");
Jetzt wird die Ziffernliste in zwei Teile zerlegt. ziffern[1] ist der Anteil vor dem Komma, alles ab Position 2 sind Nachkommastellen. Der wiederholte Rest wurde an Position anfang notiert — also gehören die Ziffern danach zur Periode, die davor stehen einmalig hinter dem Komma. Bei 1/6 = 0,16 ist die 1 die Vorperiode und die 6 die Periode. slice() schneidet ein Stück aus dem Array heraus, join("") klebt die einzelnen Ziffern ohne Trennzeichen zu einer Zeichenkette zusammen.
zahl += "," + vorPeriode +
'<span style="text-decoration: overline;">' + periode + "</span>";
Die Periode wird in ein <span> mit der CSS-Eigenschaft text-decoration: overline gepackt — das ist der Strich über den Ziffern, wie man ihn aus dem Mathebuch kennt. Weil hier HTML im Text steckt, muss die Ausgabe mit innerHTML gesetzt werden und nicht mit textContent; letzteres würde die spitzen Klammern als sichtbaren Text anzeigen. Wer lieber Klammern statt eines Strichs mag, ersetzt das <span> einfach durch runde Klammern um die Periode.
Anpassen lässt sich außerdem die Notbremse: MAX_STELLEN steht auf 2000. Da die Periode höchstens Nenner minus eins Stellen lang werden kann, rechnet das Script mit dieser Grenze jeden Nenner bis 2000 vollständig durch.
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
-
5 Zahlen
-
Altersberechnungen
-
Anzahl der Stellen von Potenzen kalkulieren
-
Barrel in Liter
-
Beliebige Wurzel ziehen
-
Binomialverteilung
-
Collatz Problem
-
Denk Dir eine Zahl
-
Dezimalzahl in Binärzahl umwandeln
-
Die Kamelhändler
-
Downloadzeit-Rechner
-
Drehender Kreis 1
-
Drehender Kreis 2
-
Drehender Kreis 3
-
Dreiecksrechner
-
Dreisatz
-
Dreisatz antiproportional
-
Einfacher Euro-Rechner
-
Fakultät berechnen
-
Fakultätsrechner
-
Fibonacci Reihe berechnen
-
Fibonacci-Zahlen
-
Flächenberechnung / Dreieck
-
Flächenberechnung / Kreis
-
Flächenberechnung / Parallelogramm
-
Flächenberechnung / Rechteck
-
Flächenberechnung / Trapez
-
Gedanken lesen
-
Geschwindigkeitsmesser