Zum Inhalt springen
aviral gupta

// B2.2 · ca. 30 Min. · Einstieg

Zahlen, Math und Runden

Nach dieser Lektion rechnen Sie mit allen Rechenoperatoren, runden Zahlen so, wie Sie es meinen, und gehen mit NaN, Infinity und Zahlen in Text um.

Lektion 2 von 5 in B2 Grammatik, Typen und Operatoren

Danach können Sie

  • Mit +, -, *, /, % und ** rechnen und erklären, warum 0.1 + 0.2 nicht genau 0.3 ist
  • Mit Math.round, Math.floor, Math.ceil und Math.trunc runden und mit toFixed formatieren, das einen String liefert
  • NaN und Infinity erkennen, mit Number.isNaN prüfen, Zahlen mit parseInt und parseFloat lesen und die Grenze sicherer Ganzzahlen kennen
  1. Aufwärmen · Aufgabe 1 von 7

    Zum Aufwärmen: Was gibt dieser Code aus?

    console.log(7 / 2);
  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt dieser Code aus?

    console.log(0.1 + 0.2);
  3. Üben · Aufgabe 3 von 7

    17 Eier kommen in Schachteln zu 5 Stück. Ergänzen Sie den Operator, sodass das Programm ausgibt, wie viele Eier übrig bleiben: 2.

    console.log(17 ____ 5);
    console.log(17 5);
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jedem Aufruf zu, was console.log dafür ausgibt.

  5. Üben · Aufgabe 5 von 7

    Was gibt dieser Code aus?

    const price = (19.999).toFixed(2);
    console.log(price + 1);
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Was gibt dieser Code aus?

    console.log((1.005).toFixed(2));
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Vier Freunde teilen sich eine Rechnung über 47.8 Euro und geben 10 % Trinkgeld, auf ganze Euro gerundet. Geben Sie das Trinkgeld, die Summe, den Anteil pro Person mit zwei Nachkommastellen und den Anteil aus, wenn alle auf ganze Euro aufrunden.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Eine Restaurantrechnung teilen

Drei Freunde teilen eine Rechnung über 87.40 Euro. Der genaue Anteil hat einen langen Schwanz aus Ziffern, also formatiert das Programm ihn mit toFixed, rundet ihn mit Math.ceil auf und verteilt mit % zehn Gäste auf Vierertische. Zum Schluss liest es zwei Zahlen aus Text und zeigt eine Rechnung, die scheitert. Führen Sie es aus und ändern Sie dann people auf 4.

main.js

// Splitting a restaurant bill between friends.
const bill = 87.4;
const people = 3;
const share = bill / people;
console.log("exact share:", share);
console.log("rounded:", share.toFixed(2), typeof share.toFixed(2));
console.log("each pays, whole euros:", Math.ceil(share));
console.log("tip at 10%:", Math.round(bill * 0.1));
console.log("tables of 4 for 10 guests:", Math.ceil(10 / 4), "with", 10 % 4, "at the last");
console.log("from text:", Number.parseFloat("12.5%"), Number.parseInt("3 guests", 10));
console.log("broken:", 0 / 0, Number.isNaN(0 / 0), 1 / 0);

Ausführen mit

node main.js

Ausgabe

exact share: 29.133333333333336
rounded: 29.13 string
each pays, whole euros: 30
tip at 10%: 9
tables of 4 for 10 guests: 3 with 2 at the last
from text: 12.5 3
broken: NaN true Infinity
  • Der genaue Anteil endet auf …336, nicht auf …333: In der letzten Stelle zeigt sich die binäre Speicherung.
  • toFixed(2) liefert den String "29.13", fertig für die Ausgabe, aber nicht zum Weiterrechnen.
  • Math.ceil rundet auf, also decken drei Personen mit je 30 die Rechnung.
  • 10 % 4 ist 2: Zwei Gäste sitzen am dritten Tisch.
  • parseFloat und parseInt lesen die Zahl am Anfang des Textes und ignorieren den Rest.
  • 0 / 0 ist NaN, was Number.isNaN erkennt; 1 / 0 ist Infinity, kein Fehler.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Den Gewinn teilen

Drei Gewinner teilen sich 100 Euro. Geben Sie drei Zeilen aus: Each: 33.33 (der genaue Anteil mit zwei Nachkommastellen), Round up: 34 (der Anteil, auf ganze Euro aufgerundet) und Remainder: 1 (die Euro, die übrig bleiben, wenn jeder ganze Euro bekommt). Berechnen Sie jeden Wert aus prize und winners.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    (prize / winners).toFixed(2) ergibt "33.33". Die Klammern sorgen dafür, dass zuerst geteilt wird.

  2. Hinweis 2

    Math.ceil rundet immer auf, aus 33.33… wird also 34.

  3. Hinweis 3

    Der Rest nach dem Teilen ist prize % winners.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

const prize = 100;
const winners = 3;
console.log("Each:", (prize / winners).toFixed(2));
console.log("Round up:", Math.ceil(prize / winners));
console.log("Remainder:", prize % winners);
Auf dem eigenen Computer ausführen

Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

const prize = 100;
const winners = 3;
// Print three lines:
// Each: 33.33
// Round up: 34
// Remainder: 1
console.log("Each:", prize / winners);

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';

const lines = async () => (await runMain()).trimEnd().split('\n');

test('gibt den Anteil mit zwei Nachkommastellen aus', async () => {
  const got = await lines();
  assert.equal(got[0], 'Each: 33.33', `die erste Zeile ist ${JSON.stringify(got[0])}, erwartet: "Each: 33.33"`);
});

test('gibt den aufgerundeten Anteil aus', async () => {
  const got = await lines();
  assert.equal(got[1], 'Round up: 34', `die zweite Zeile ist ${JSON.stringify(got[1])}, erwartet: "Round up: 34"`);
});

test('gibt den Rest aus', async () => {
  const got = await lines();
  assert.equal(got[2], 'Remainder: 1', `die dritte Zeile ist ${JSON.stringify(got[2])}, erwartet: "Remainder: 1"`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Übung 2 von 2

Die Etiketten lesen

Drei Etiketten wurden als Text gelesen: "12.5 kg", "7 items" und "abc". Number() macht aus allen dreien NaN. Geben Sie weight: 12.5 mit Number.parseFloat aus, count: 7 mit Number.parseInt (Basis 10) und invalid: true, indem Sie mit Number.isNaN prüfen, ob parseFloat bei "abc" gescheitert ist.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Number.parseFloat(weightText) liest 12.5 und stoppt am Leerzeichen vor kg.

  2. Hinweis 2

    Number.parseInt(countText, 10) liest die ganze Zahl 7.

  3. Hinweis 3

    Number.parseFloat("abc") ist NaN, und Number.isNaN(NaN) ist true.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

const weightText = "12.5 kg";
const countText = "7 items";
const badText = "abc";
console.log("weight:", Number.parseFloat(weightText));
console.log("count:", Number.parseInt(countText, 10));
console.log("invalid:", Number.isNaN(Number.parseFloat(badText)));
Auf dem eigenen Computer ausführen

Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

const weightText = "12.5 kg";
const countText = "7 items";
const badText = "abc";
console.log("weight:", Number(weightText));
console.log("count:", Number(countText));
console.log("invalid:", Number(badText));

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';

const lines = async () => (await runMain()).trimEnd().split('\n');

test('liest das Gewicht', async () => {
  const got = await lines();
  assert.equal(got[0], 'weight: 12.5', `die erste Zeile ist ${JSON.stringify(got[0])}, erwartet: "weight: 12.5"`);
});

test('liest die Anzahl', async () => {
  const got = await lines();
  assert.equal(got[1], 'count: 7', `die zweite Zeile ist ${JSON.stringify(got[1])}, erwartet: "count: 7"`);
});

test('meldet das ungültige Etikett', async () => {
  const got = await lines();
  assert.equal(got[2], 'invalid: true', `die dritte Zeile ist ${JSON.stringify(got[2])}, erwartet: "invalid: true"`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Häufige Fehler

toFixed auf einem String aufrufen

const price = "4.5";
console.log(price.toFixed(2));

Was Node.js ausgibt

TypeError: price.toFixed is not a function

Warum, und die Lösung

toFixed ist eine Methode von Zahlen, und "4.5" in Anführungszeichen ist ein String, der kein toFixed hat. Das passiert oft bei Werten aus einem Formular oder bei einem Wert, der schon einmal durch toFixed gegangen ist. Wandeln Sie zuerst um: Number(price).toFixed(2) gibt 4.50 aus.

Ein Punkt direkt nach einer ganzen Zahl

console.log(5.toFixed(2));

Was Node.js ausgibt

SyntaxError: Invalid or unexpected token

Warum, und die Lösung

JavaScript liest den Punkt nach der 5 als Beginn der Nachkommastellen, 5.toFixed ist also eine Zahl mit Buchstaben in den Nachkommastellen, die sich nicht lesen lässt. Nichts in der Datei läuft. Setzen Sie die Zahl in Klammern, (5).toFixed(2), oder speichern Sie sie zuerst in einer Variablen: const n = 5; n.toFixed(2). Beides gibt 5.00 aus.

toFixed zu viele Stellen abverlangen

const share = 100 / 3;
console.log(share.toFixed(101));

Was Node.js ausgibt

RangeError: toFixed() digits argument must be between 0 and 100

Warum, und die Lösung

toFixed akzeptiert 0 bis 100 Nachkommastellen; alles andere stoppt das Programm mit einem RangeError, dem Fehler für einen Wert außerhalb des erlaubten Bereichs. Für Geld wollen Sie meist zwei Stellen. Viele Stellen machen die Zahl auch nicht genauer: Sie zeigen nur mehr vom Fehler der binären Speicherung.

JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Sechs Operatoren und binär gespeicherte Zahlen

JavaScript hat +, -, * und /, und / liefert immer das volle Ergebnis: 7 / 2 ist 3.5. % liefert den Rest einer Division: 17 % 5 ist 2, und das Ergebnis hat das Vorzeichen der linken Zahl, also ist -7 % 3 gleich -1. ** potenziert: 2 ** 10 ist 1024. Wie in der Mathematik kommt ** zuerst, dann *, / und %, dann + und -; Klammern ändern die Reihenfolge. Jede Zahl wird binär mit etwa 17 gültigen Stellen gespeichert, und viele Dezimalzahlen wie 0.1 lassen sich nicht exakt speichern. Deshalb gibt 0.1 + 0.2 den Wert 0.30000000000000004 aus.

Vier Arten zu runden, und toFixed für die Anzeige

Math.round rundet auf die nächste ganze Zahl, und genau .5 geht nach oben, Richtung plus unendlich: Math.round(2.5) ist 3, aber Math.round(-2.5) ist -2. Math.floor geht immer nach unten (Math.floor(-4.5) ist -5), Math.ceil immer nach oben (Math.ceil(4.1) ist 5), und Math.trunc schneidet die Nachkommastellen ab (Math.trunc(-4.9) ist -4). Für Geldbeträge gibt es toFixed: (0.1 + 0.2).toFixed(2) ist "0.30". Achten Sie auf die Anführungszeichen: toFixed liefert einen String, + verbindet danach also Text. Verwenden Sie es am Ende, für die Ausgabe, nicht zum Weiterrechnen.

NaN, Infinity und Zahlen in Text

Eine Rechnung ohne sinnvolles Zahlenergebnis ergibt NaN: 0 / 0 oder Number("abc") * 2. NaN pflanzt sich fort, denn auch NaN + 1 ist NaN, und es ist nicht einmal sich selbst gleich. Prüfen Sie es deshalb mit Number.isNaN(value). Division durch null ergibt Infinity oder -Infinity, keinen Fehler. Steht eine Zahl am Anfang eines Textes, liest Number.parseFloat("12.5 kg") den Wert 12.5 und stoppt am ersten Zeichen, das nicht zu einer Zahl gehören kann; Number.parseInt("42px", 10) liest die ganze Zahl 42. Geben Sie 10 als zweites Argument an. Ganze Zahlen sind nur bis Number.MAX_SAFE_INTEGER exakt, 9007199254740991.

Quellen

Zuletzt geprüft am 30. September 2026