Ganze und dezimale Zahlen
In der ersten Lektion hast du gesehen, dass 10 / 2 den Wert 5.0 ausgibt und nicht 5. Jetzt erfährst du, warum. Lua hat zwei Arten von Zahlen:
- Ganze Zahlen, die Programmierer Integer nennen:
120,0,-3. Emmas Münzen, Eier und Tage sind ganze Zahlen. - Dezimalzahlen, die Programmierer Floats nennen (von floating point, Gleitkomma, so speichern Computer sie):
2.5,0.75,-1.5. Sie werden mit einem Dezimalpunkt geschrieben, nie mit einem Komma.
Lua gibt einen Float immer mit Dezimalpunkt aus, auch wenn er ganzzahlig ist: 5.0 ist ein Float, 5 ein Integer. Es ist dieselbe Menge, aber Lua merkt sich, welche Art jede Zahl ist. Die Funktion math.type verrät es dir:
print(math.type(5))
print(math.type(5.0))
print(math.type(2.5))Das gibt Folgendes aus:
integer
float
float(math ist Luas Sammlung von Mathefunktionen. In der nächsten Übung benutzt du weitere davon.)
Ob ein Ergebnis ein Integer oder ein Float ist, hängt vom Operator ab:
+,-und*ergeben einen Integer, wenn beide Zahlen Integer sind. Ist eine davon ein Float, ist auch das Ergebnis ein Float:3 * 2ist6, aber3 * 2.0ist6.0./(Division) ergibt immer einen Float, auch wenn die Division aufgeht:10 / 2ist5.0.//(ganzzahlige Division) teilt und rundet das Ergebnis auf eine ganze Zahl ab:7 // 2ist3. Es sagt dir, wie oft eine Zahl in eine andere passt.%ergibt den Rest der Division:7 % 2ist1, weil die 2 dreimal in die 7 passt und 1 übrig bleibt.^potenziert eine Zahl und ergibt immer einen Float:2 ^ 3ist8.0.
print(7 / 2)
print(7 // 2)
print(7 % 2)
print(10 / 2)
print(2 ^ 3)Das gibt Folgendes aus:
3.5
3
1
5.0
8.0// und % passen gut zusammen. Die Erdbeeren sind in 17 Tagen reif: 17 // 7 sind 2 ganze Wochen, und 17 % 7 sind 3 Tage Rest. Der Rest verrät auch, ob eine Zahl gerade oder ungerade ist: Eine gerade Zahl lässt bei der Division durch 2 den Rest 0, eine ungerade den Rest 1.
Typische Fehler:
/, wo du eine ganze Zahl willst:17 / 7ergibt2.4285714285714. Nimm//.- Ganzzahlige Division durch null:
7 // 0hält das Programm mit dem Fehlerattempt to divide by zeroan. (7 / 0hält es nicht an, ergibt aberinf, unendlich, womit man auch nicht viel anfangen kann.) - Ein Dezimalkomma:
local preis = 2,5meldet keinen Fehler, aberpreisist nur2. In Lua trennt ein Komma zwei Werte. Die Variable bekommt den ersten, und die 5 geht verloren.
Noch etwas: Computer speichern Floats binär, deshalb sind viele Dezimalzahlen nicht exakt. 0.1 + 0.2 gibt 0.3 aus, aber das Ergebnis ist in Wirklichkeit ein winziges bisschen größer. Das ist ein Grund, warum man Geld am besten in ganzen Zahlen zählt, wie Emma es mit ihren Münzen tut.
So schreibst du es:
Anweisungen
- 1
Führe das Programm aus. Es gibt
Schachteln: 6.3333333333333aus, aber Emma kann kein Drittel einer Schachtel verkaufen. Ändere die Division so, dass das Programm nur die Zahl der vollen Schachteln ausgibt:Schachteln: 6 - 2
Gib in der nächsten Zeile aus, wie viele Eier übrig bleiben. Berechne es aus den Variablen mit
%:Schachteln: 6 Eier übrig: 2 - 3
Der Händler Hugo zahlt 12 Münzen für eine volle Schachtel. Erzeuge darunter eine Variable
schachtelPreismit dem Wert12und gib aus, wie viel Emma für ein Ei bekommt:schachtelPreisgeteilt durchschachtelGroesse, mit/. Die Division geht auf, aber/ergibt immer einen Float, deshalb gibt Lua2.0aus:Schachteln: 6 Eier übrig: 2 Münzen pro Ei: 2.0 - 4
Prüfe zum Schluss die Art der beiden Ergebnisse. Gib mit einem
printmath.type(eier // schachtelGroesse)undmath.type(schachtelPreis / schachtelGroesse)aus, durch ein Komma getrennt:Schachteln: 6 Eier übrig: 2 Münzen pro Ei: 2.0 integer float