Arithmetik — Division, Reste und die Dezimal-Falle
Die sieben arithmetischen Operatoren, welcher zuerst läuft, wo Ganzzahldivision und Reste nützlich sind und warum Dezimalzahlen manchmal seltsam antworten.
Wie möchtest du lernen?
Das Problem, das wir lösen
Es gibt 17 Bücher und eine Kiste fasst 5. Wie viele Kisten, und wie viele Bücher bleiben übrig?
Die Antwort ist nicht 17 / 5. Das ergibt 3.4, und so etwas wie 3.4 Kisten gibt es nicht. Du brauchst zwei getrennte Antworten: wie viele ganze und wie viel übrigbleibt. Python hat für jeden einen Operator, und es stellen sich zwei der nützlichsten heraus, die du lernen wirst — Paginierung, Sekunden in Stunden und Minuten aufteilen, prüfen, ob eine Zahl gerade ist — alles kommt von hier.
Da ist noch ein zweites Ding, das jeden beim ersten Anblick stoppt: In Python ergibt 0.1 + 0.2 nicht 0.3. Warum das so ist und was du dagegen tun kannst, ist ebenfalls in diesem Kapitel.
Am Ende dieses Kapitels kannst du
- Die sieben arithmetischen Operatoren benutzen
- Sagen, welche Rechnung zuerst läuft und wann Klammern nötig sind
- Erkennen, wann
//und%das richtige Werkzeug sind - Erklären, warum
/immer eine Dezimalzahl ergibt, auch wenn die Division aufgeht - Berechnungen schreiben, die die Präzisionsgrenzen von Dezimalzahlen beachten
Voraussetzungen: Variablen und Typen.
Die sieben Operatoren
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
print(10 // 3)
print(10 % 3)
print(10 ** 3)13
7
30
3.3333333333333335
3
1
1000Die letzten drei brauchen noch ein paar Worte:
//— Floor-Division. Dividiert und behält den ganzen Teil, verwirft den Rest%— Modulo, der Rest. Was nach der Division übrig bleibt**— Potenz.10 ** 3ist zehn hoch drei
/ergibt immer eine Dezimalzahl. Selbst10 / 5ergibt2.0, nicht2. Wenn der Typ davon abhinge, ob die Division aufgeht, wäre das Verhalten eines Programms unvorhersehbar; also hält sich Python hier an eine Regel:/bedeutetfloat. Wenn du eine ganze Zahl brauchst, nutze//.
Das Kistenproblem lösen
books = 17
per_box = 5
full_boxes = books // per_box
left_over = books % per_box
print("Full boxes:", full_boxes)
print("Left over :", left_over)Full boxes: 3
Left over : 2Drei Kisten füllen sich, 2 Bücher bleiben draußen. // und % gehören wie ein Paar zusammen — eines sagt „wie viele ganze“, das andere „wie viel übrigbleibt“.
Dasselbe Paar taucht an vielen anderen Stellen auf:
total_seconds = 500
minutes = total_seconds // 60
seconds = total_seconds % 60
print(minutes, "min", seconds, "sec")8 min 20 secUnd mit % prüft man gerade und ungerade. Teile eine beliebige Zahl durch 2, und der Rest ist 0 (gerade) oder 1 (ungerade):
print(14 % 2)
print(15 % 2)0
1Dieser Rest ist genau das, worauf ein späteres Kapitel über Bedingungen (if) aufbauen wird.
Welche Rechnung zuerst läuft
Python folgt den üblichen Regeln der Arithmetik — Multiplikation und Division vor Addition und Subtraktion:
print(10 + 5 * 2)
print((10 + 5) * 2)20
30In der ersten Zeile lief 5 * 2 zuerst, dann wurde 10 addiert. In der zweiten haben die Klammern die Reihenfolge geändert.
Von höchster zu niedrigster Priorität:
***,/,//,%+,-
print(2 + 3 * 4 ** 2)504 ** 2 ist 16, dann ist 3 * 16 gleich 48, und 2 + 48 ist 50.
Im Zweifel Klammern setzen. Selbst wenn du die Regeln kennst, ist(a + b) / 2besser geschrieben alsa + b / 2— die nächste Person, die das liest, muss sich keine Regel mehr merken. Zusätzliche Klammern bremsen den Code nicht; sie machen ihn nur klarer.
Das ist der häufigste Anfängerfehler überhaupt, und er taucht beim Mittelwert auf:
a = 10
b = 20
c = 30
wrong = a + b + c / 3
right = (a + b + c) / 3
print("Wrong:", wrong)
print("Right:", right)Wrong: 40.0
Right: 20.0Das Programm warf keinen Fehler. Nichts in Rot, nichts kaputt — nur eine falsche Antwort. Das ist die gefährlichste Art von Bug überhaupt, denn Python wird dich nicht warnen. Nur wenn du die Rechnung selbst nachprüfst, findest du ihn.
Die Dezimal-Falle
print(0.1 + 0.2)0.30000000000000004Das ist nicht Pythons Schuld. Computer speichern Zahlen im Dualsystem, und 0.1 lässt sich im Dual nicht genau schreiben — so wie sich 1/3 im Dezimalsystem nicht genau schreiben lässt, wo 0.3333... unendlich weiterläuft. Also speichert der Computer etwas, das extrem nah daran liegt, und addiert man zwei davon, wird der winzige Unterschied sichtbar. JavaScript, Java und C verhalten sich genauso.
Zwei praktische Konsequenzen:
Erstens — beim Anzeigen runden:
total = 0.1 + 0.2
print(round(total, 2))0.3round(total, 2) bedeutet: behalte zwei Stellen nach dem Dezimalpunkt.
Zweitens — vergleiche zwei Dezimalzahlen nie mit ==:
print(0.1 + 0.2 == 0.3)FalseDas ist die Falle, die in Finanzberechnungen falsche Antworten produziert. Ernsthafte Projekte halten ihr Geld nicht in einem float — sie speichern die kleinste Einheit als ganze Zahl (49.99 wird zu 4999), oder sie nutzen das separate Modul decimal. Vorerst genügt es zu wissen, wo die Grenze liegt; Module kommen später.
Ein vollständiges Beispiel
packing.py:
# Work out packing and shipping for one order
total_items = 47
items_per_box = 6
box_cost = 35.5
full_boxes = total_items // items_per_box
loose_items = total_items % items_per_box
# A partly filled box still costs a full box
boxes_needed = full_boxes
if loose_items > 0:
boxes_needed = full_boxes + 1
shipping = boxes_needed * box_cost
print("Items :", total_items)
print("Full boxes :", full_boxes)
print("Loose items :", loose_items)
print("Boxes needed :", boxes_needed)
print("Shipping :", round(shipping, 2))Items : 47
Full boxes : 7
Loose items : 5
Boxes needed : 8
Shipping : 284.0Die if-Zeile wurde noch nicht behandelt — dafür sind die nächsten Kapitel da. Lies sie vorerst einfach nur: Wenn einzelne Artikel lose übrig bleiben, wird eine Kiste mehr gebraucht.
Wenn etwas schiefgeht
ZeroDivisionError: division by zero Etwas wurde durch null geteilt. Auch in der Mathematik ist das undefiniert, also stoppt Python. Du musst den Divisor vor dem Teilen prüfen — was leicht wird, sobald du Bedingungen kennst.
10 / 5 ergab 2.0, und ich brauche 2 Nutze // oder schreibe int(10 / 5). Das erste ist besser: Die Absicht ist im Code sichtbar.
// antwortet bei negativen Zahlen seltsam -7 // 2 ergibt -4, nicht -3. Python rundet ab, nicht auf null zu. Merkenswert, wenn du mit Negativzahlen arbeitest.
Die Rechnung sieht richtig aus, die Antwort stimmt aber nicht Zähle die Klammern und schreibe jeden Schritt in eine eigene Zeile und gib ihn aus. Der Fehler ist fast immer die Operatorrangfolge.
Ein langer Schwanz von Ziffern nach dem Dezimalpunkt Das ist kein Fehler — so verhalten sich Dezimalzahlen. Kürze es mit round(), wenn du es anzeigst.
Schritt 4 von 6 — Vorhersagen
Prüfe dein Verständnis
Alle drei Zeilen rechnen mit denselben beiden Zahlen, jedes Mal mit einem anderen Operator. Was ist die Ausgabe?
print(7 / 2)
print(7 // 2)
print(7 % 2)- A3 3 1
- B3.5 4 1
- C3.5 3.5 1
- D3.5 3 1
Das Programm läuft ohne jeden Fehler, berechnet aber den Mittelwert als 40.0. Warum?
a = 10
b = 20
c = 30
average = a + b + c / 3
print("Average:", average)- A`average` ist ein Python-Keyword, deshalb wurde der Wert nicht korrekt gespeichert
- BMittelwerte müssen `//` verwenden, nicht `/`
- C`/` läuft zuerst, also wurde nur `c` geteilt — es muss `(a + b + c) / 3` heißen
- DDie drei Zahlen sind `int`, dadurch wird das Ergebnis falsch
Was ist die Ausgabe dieser beiden Zeilen?
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)- A0.3 True
- B0.3 False
- C0.30000000000000004 False
- D0.30000000000000004 True
Zum Antworten brauchst du ein Konto
Melde dich an, um deine Antworten zu prüfen
Die Fragen stehen oben, und sie im Kopf durchzuarbeiten ist der wichtige Teil. Melde dich an, um die Antworten, die Erklärungen und die dreistufigen Hinweise zu sehen.
Jetzt bist du dran
Schreibe eine Datei namens time_split.py, die eine Anzahl Sekunden in Stunden, Minuten und Sekunden aufteilt.
Starte mit total_seconds = 7385, und die Ausgabe soll so aussehen:
2 h 3 m 5 sDrei Bedingungen:
- Nutze nur
//und%— tippe keines der Ergebnisse von Hand - Speichere die drei Werte in drei getrennten, sinnvoll benannten Variablen
- Ändere dann
total_secondsauf59,60,3600und86399und führe jede Zahl aus — prüfe, dass alle vier stimmen
Überspringe diesen letzten Schritt nicht. Ein Programm, das für einen Eingabewert funktioniert, funktioniert nicht; ein Programm, das auch an den Grenzen hält, schon.
In dieser Mission steckt noch mehr
Was du oben gelesen hast, ist die vollständige Mission – nichts wurde herausgekürzt. Pro ergänzt:
- Was wirklich unter der Haube passiert – wie Python das ausführt
- Die vollständige Lösung der Übung, Schritt für Schritt erklärt
- Schwierigere Zusatzübungen
- Die Interviewfrage zu diesem Thema, mit Musterantwort
Schritt 6 von 6
Herausforderung — das Kapitel-Quiz
Zehn Fragen von leicht bis schwer. Die letzten sind absichtlich knifflig.
Melde dich an, um das Quiz zu machen