Operatoren und Arithmetik
Kurz gesagt: Die arithmetischen Operatoren +, -, *, / und % rechnen mit Zahlen: / schneidet den Nachkommateil nicht ab (17 / 5 ist 3.4), Math.trunc schneidet ihn ab, und % ergibt den Rest.
Problem
Die Rechnung am Tisch
Du hast drei Kaffees zu 2,50 € und zwei Croissants zu 1,50 € bestellt. Du zahlst mit einem 20-€-Schein. Wie hoch ist die Rechnung, und wie viel Rückgeld bekommst du?
Im Kopf geht das. Aber die Kasse im Café macht so eine Rechnung hunderte Male am Tag, mit anderen Preisen und Mengen. Das Programm muss selbst rechnen.
Die Idee
Die arithmetischen Operatoren
Du rechnest wie auf Papier: + addiert, - subtrahiert, * multipliziert, / dividiert. Diese Zeichen heißen Operatoren.
const coffee = 2.5;const croissant = 1.5;const total = 3 * coffee + 2 * croissant;const change = 20 - total;console.log("Gesamt: " + total + " €");console.log("Rückgeld: " + change + " €");Gesamt: 10.5 €Rückgeld: 9.5 €Die Reihenfolge ist wie in der Mathematik: zuerst * und /, dann + und -. Deshalb ist 3 * coffee + 2 * croissant gleich 7,5 + 3. Willst du eine andere Reihenfolge, setzt du Klammern: (2 + 3) * 4 ist 20.
Es gibt noch einen fünften Operator, %. Um ihn geht es in der nächsten Idee.
Genauer, für Neugierige
- Operatoren mit gleichem Vorrang werden von links nach rechts berechnet:
20 - 5 - 3ist 12, nicht 18. -vor einer Zahl macht sie negativ:-total.
- Bei Text addiert
+nicht, sondern hängt an. Sobald links Text steht, wird alles danach als Text angehängt. Das ist die Falle in der nächsten Karte.
Probier es aus
Konzertkarten
Drei Karten zu 8 € und 5 € Bestellgebühr.
Was gibt das Programm aus?
const tickets = 3;const fee = 5;console.log("Gesamt: " + tickets * 8 + fee);* wird zuerst berechnet: tickets * 8 ist 24. Dann von links nach rechts: „Gesamt: “ + 24 ist der Text „Gesamt: 24“, und daran wird die 5 angehängt. Damit 29 herauskommt, muss die Rechnung in Klammern stehen: "Gesamt: " + (tickets * 8 + fee).Problem
2,25 Stunden statt 2 Std. 15 Min.
Der Film dauert 135 Minuten. Du willst ihn als Stunden und Minuten zeigen: 2 Std. 15 Min. Der erste Versuch:
const minutes = 135;const hours = minutes / 60;console.log(hours + " Std.");2.25 Std.In JavaScript ergibt / immer eine Kommazahl, auch wenn beide Zahlen ganz sind: 6 / 3 ist 2, und 17 / 3 ist 5.666666666666667. Hier brauchst du aber zwei ganze Stunden und die übrigen Minuten. Wie bekommst du nur den ganzzahligen Teil?
Die Idee
Der ganzzahlige Teil und der Rest
Math.trunc(...) schneidet den Nachkommateil einer Zahl ab: Math.trunc(2.25) ist 2. Deshalb ergibt Math.trunc(135 / 60) die ganzen Stunden, und Math.trunc(17 / 3) ist 5. Das nennt man Ganzzahldivision. Math ist eine Sammlung fertiger Berechnungen. Weitere davon kommen am Ende der Lektion.
Hier ist sie Schritt für Schritt, mit der Summe von drei Noten:
const math = 5;const physics = 6;const english = 6;const whole = Math.trunc((math + physics + english) / 3);console.log("Ganzzahliger Teil: " + whole);Schritt für Schritt, in Worten
- Drei Noten: 5, 6, 6.
- Zuerst die Klammern: 5 + 6 + 6 = 17.
- 17 / 3 ist 5,667…, und Math.trunc behält nur den ganzzahligen Teil: Wie viele ganze Gruppen zu 3 passen in 17? 5.
- Der Rest 2 (also 17 % 3) wird abgeschnitten. Das Ergebnis ist die ganze Zahl 5.
- 5 wird in whole gespeichert.
- Ausgegeben wird „Ganzzahliger Teil: 5“. Der Nachkommateil (5,67) ist nicht im Ergebnis.
Was abgeschnitten wird, ist nicht ganz verloren. Der Operator % ergibt den Rest der Division: 17 % 3 ist 2, denn 17 = 5 · 3 + 2.
Zusammen teilen die beiden eine Menge in ganze Teile und einen Rest. Der Film dauert 135 Minuten:
const minutes = 135;const hours = Math.trunc(minutes / 60);const rest = minutes % 60;console.log(hours + " Std. " + rest + " Min.");2 Std. 15 Min.% wirst du oft brauchen. Eine Zahl ist gerade, wenn n % 2 gleich 0 ist. Die letzte Ziffer einer Zahl ist n % 10.
Genauer, für Neugierige
- Bei negativen Zahlen schneidet
Math.truncRichtung null ab, und der Rest hat das Vorzeichen des Dividenden.%funktioniert auch mit Kommazahlen:
console.log(Math.trunc(-7 / 2));console.log(-7 % 2);console.log(7.5 % 2);-3-11.5- Eine Division durch 0 bricht das Programm nicht ab:
5 / 0ergibtInfinity(unendlich), und0 / 0und5 % 0ergebenNaN(„keine Zahl“).
Probier es aus
Flaschen in Kisten
In eine Kiste passen 6 Flaschen. Du hast 17.
Was gibt das Programm aus?
const bottles = 17;const perCase = 6;console.log(Math.trunc(bottles / perCase) + " Kisten");console.log(bottles % perCase + " bleiben übrig");Math.trunc(17 / 6) sind 2 volle Kisten (12 Flaschen), und 17 % 6 ist der Rest: 5 Flaschen, die keine Kiste füllen.
Die Idee
Umwandlung zwischen Typen
In JavaScript sind Zahlen ein einziger Typ, number. Es gibt keine getrennten Typen für ganze Zahlen und Kommazahlen, zwischen denen du umwandeln müsstest: / ergibt eine Kommazahl, wie du gesehen hast. Eine ganze Zahl aus einer Kommazahl machst du mit Math:
const total = 5 + 6 + 6;const average = total / 3;console.log(average);console.log(average.toFixed(2));const whole = Math.trunc(9.99);console.log(whole);5.6666666666666675.679Math.trunc(9.99)ist 9: Es schneidet den Nachkommateil ab, es rundet nicht;Math.round(9.99)ist 10: Es rundet auf die nächste ganze Zahl;Math.floor(9.99)ist 9 undMath.ceil(9.01)ist 10: Sie runden ab und auf.
Eine Umwandlung zwischen Typen gibt es in JavaScript von Text zu Zahl: Das ist Number(...) aus der Lektion über die Eingabe.
Genauer, für Neugierige
- Jedes Zeichen hat einen Code, eine Zahl in der Zeichentabelle.
charCodeAt(0)ergibt den Code des ersten Zeichens, undString.fromCharCodemacht aus einem Code ein Zeichen:
console.log("A".charCodeAt(0));console.log(String.fromCharCode(66));const maxInt = 2147483647;console.log(maxInt + 1);console.log(9007199254740992 + 1);65B21474836489007199254740992- In Java und C# reicht
intbis 2 147 483 647, und eins mehr „springt“ zu einer negativen Zahl. In JavaScript ist 2147483647 + 1 gleich 2147483648. Die Grenze liegt woanders: Ganze Zahlen sind bis 9 007 199 254 740 991 exakt, danach verlieren sie an Genauigkeit (die letzte Zeile). Für größere ganze Zahlen gibt esBigInt.
Probier es aus
Finde den Fehler
Die Stromrechnung beträgt 125 € und wird auf drei Mitbewohner aufgeteilt. Das Programm sagt, jeder zahlt 41,00 €, es sollten aber 41,67 € sein. In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
bill / people ist 41.666…, aber Math.trunc schneidet den Nachkommateil ab, und 41 bleibt übrig. toFixed(2) zeigt es danach als 41.00. Die Korrektur: nichts abschneiden, const share = bill / people;.Die Idee
Kurzschreibweisen: += und ++
Oft änderst du einen Wert auf Basis von sich selbst: Das Guthaben auf der Karte sinkt mit jedem Einkauf, ein Zähler steigt um eins. Dafür gibt es kurze Schreibweisen:
let balance = 20;let purchases = 0;balance -= 4.5;purchases++;balance -= 3.5;purchases++;console.log(purchases + " Einkäufe, es bleiben " + balance + " €");2 Einkäufe, es bleiben 12 €| Du schreibst | Das bedeutet |
|---|---|
balance -= 4.5; |
balance = balance - 4.5; |
total += price; |
total = total + price; |
x *= 2;, x /= 2;, x %= 2; |
dasselbe mit *, / und % |
purchases++; |
purchases = purchases + 1; |
seats--; |
seats = seats - 1; |
+= funktioniert auch mit Text: message += "!"; hängt ein Ausrufezeichen ans Ende.
Genauer, für Neugierige
++ kann auch vor der Variable stehen. Allein in einer Zeile gibt es keinen Unterschied. In einem Ausdruck schon: a++ liefert den alten Wert und erhöht danach, ++a erhöht zuerst und liefert den neuen Wert.
let a = 5;const b = a++;const c = ++a;console.log(a + " " + b + " " + c);7 5 7So ein Code ist schwer zu lesen. Schreib ++ und -- allein in eine Zeile.
Die Idee
Math: Wurzel, Potenz, Runden
Eine Pizzeria verkauft eine 30-cm-Pizza zum selben Preis wie zwei 20-cm-Pizzen. Was ist mehr? Die Fläche eines Kreises ist π · r². Für die Potenz und für π gibt es Fertiges in Math: Du schreibst den Namen und in Klammern die Zahlen. Math ist immer verfügbar, ohne dass du es lädst. Das sind Funktionen, fertige Codestücke. Eigene schreibst du im Modul „Funktionen“.
const big = Math.PI * Math.pow(15, 2);const small = 2 * Math.PI * Math.pow(10, 2);console.log(`Eine 30-cm-Pizza: ${big.toFixed(1)} cm²`);console.log(`Zwei 20-cm-Pizzen: ${small.toFixed(1)} cm²`);console.log(Math.sqrt(144));console.log(Math.abs(-7.5));Eine 30-cm-Pizza: 706.9 cm²Zwei 20-cm-Pizzen: 628.3 cm²127.5Eine große Pizza ist mehr als zwei kleine.
| Du schreibst | Was es ergibt |
|---|---|
Math.sqrt(x) |
die Quadratwurzel |
Math.pow(x, n) oder x ** n |
x hoch n |
Math.abs(x) |
den Betrag (ohne Vorzeichen) |
Math.round(x) |
Runden auf eine ganze Zahl |
Math.trunc(x) |
den ganzzahligen Teil, ohne Runden |
Math.PI |
die Zahl π, 3,14159… |
In JavaScript ist Math.sqrt(144) gleich 12: Die Zahl hat denselben Typ, ob ganz oder mit Komma.
Genauer, für Neugierige
- Runden von 2,5: Die Sprachen liefern verschiedene Ergebnisse.
console.log(Math.round(2.5));console.log(Math.round(3.5));console.log(Math.round(-2.5));console.log(Math.round(5.678 * 100) / 100);34-25.68Math.roundrundet „die Hälfte“ auf, zur größeren Zahl hin: 2,5 wird zu 3, und -2,5 wird zu -2. Für zwei Nachkommastellen multiplizierst du mit 100, rundest und teilst durch 100. Wenn es nur um die Ausgabe geht, isttoFixed(2)bequemer.
- toFixed richtet sich nicht nach den Spracheinstellungen des Computers: Der Punkt bleibt überall ein Punkt.
Übung
Lass das Programm rechnen
Löse die Aufgaben in deinem Editor. Jede Zahl der Eingabe steht in einer eigenen Zeile.
1. Durchschnitt von drei Zahlen. Lies drei ganze Zahlen ein und gib ihren Durchschnitt mit zwei Nachkommastellen aus. Hier brauchst du eine Division mit Kommazahl.
566Durchschnitt: 5.672. Sekunden in Stunden. Lies eine Anzahl Sekunden ein und teile sie in Stunden, Minuten und Sekunden auf. Tipp: Eine Stunde hat 3600 Sekunden, und % ergibt, was übrig bleibt.
37251 Std. 2 Min. 5 Sek.3. Volumen einer Kugel. Lies den Radius ein und gib das Volumen aus: V = 4/3 · π · r³. Hier ist 4 / 3 gleich 1.333…, wie es sein soll.
10Volumen: 4188.79 cm³4. Celsius in Fahrenheit. F = C · 9 / 5 + 32. Lies die Temperatur in Grad Celsius ein.
3737.0 °C = 98.6 °FWeitere Aufgaben
- Zoll in Zentimeter. Ein Zoll sind 2,54 cm. Für 12 Zoll:
30.48 cm. - Fläche eines Rechtecks. Lies Länge und Breite ein und gib die Fläche aus (Länge · Breite).
- Fläche eines Quadrats. Lies die Seitenlänge ein und gib die Fläche aus. Mach es einmal mit
*und einmal mitMath.pow. - Bogenmaß in Grad. Grad = Bogenmaß · 180 / π. Für 3.14159:
180.00°. - Stunden in Sekunden. Lies eine Anzahl Stunden ein und gib aus, wie viele Sekunden das sind. Für 2 Stunden: 7200.
- Der Code eines Zeichens. Lies ein Zeichen ein und gib seinen Code aus. Für
A: 65. Das erste Zeichen des eingelesenen Texts bekommst du mit(await ask(""))[0]. Was das bedeutet, siehst du in der Lektion über Text.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Dein erstes Programm · Variablen und Typen · Eingabe und Ausgabe
- Geht weiter in: Bedingungen · Schleifen · Arrays · Zweidimensionale Arrays
- Aufgaben zum Thema: Sprachgrundlagen