In Elixir gibt es zwei verschiedene Arten von Zahlen: Ganzzahlen und Gleitkommazahlen.
Gleitkommazahlen sind Zahlen mit einer oder mehreren Nachkommastellen. Sie verwenden das 64-Bit-Gleitkommaformat mit doppelter Genauigkeit.
float = 3.45
# => 3.45
Elixir unterstützt für Gleitkommazahlen auch die wissenschaftliche Notation.
1.25e-2
# => 0.0125
Gleitkommazahlen sind berüchtigt für ihre Rundungsfehler.
0.1 + 0.2
# => 0.30000000000000004
Solche Fehler sind jedoch nicht auf Elixir beschränkt. Sie treten in allen Programmiersprachen auf. Der Grund dafür ist, dass alle Daten auf unseren Computern als Binärcode gespeichert und verarbeitet werden. Im Binärsystem lassen sich nur Brüche exakt darstellen, deren Nenner sich als 2^n ausdrücken lässt (z. B. 1/4, 3/8, 5/16). Andere Brüche werden durch Näherungen dargestellt.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Mehr über dieses Problem erfährst du auf 0.30000000000000004.com. Die Seite Float Toy bietet eine schöne, grafische Erklärung, wie die Bits einer Gleitkommazahl in einen tatsächlichen Gleitkommawert umgewandelt werden.
Ganzzahlen und Gleitkommazahlen können als gleich (==) betrachtet werden, wenn sie denselben Wert haben. Da sie aber unterschiedliche Typen sind, sind sie nie streng gleich (===).
1 == 1.0
# => true
1 === 1.0
# => false
Ganzzahlen und Gleitkommazahlen können in einem einzigen arithmetischen Ausdruck gemischt werden. Wenn du eine Gleitkommazahl in einem Ausdruck verwendest, ist das Ergebnis ebenfalls eine Gleitkommazahl.
2 * 3
# => 6
2 * 3.0
# => 6.0
Gleitkommazahlen können gerundet (round), aufgerundet (ceil) oder abgerundet (floor) werden.
Um eine Gleitkommazahl zu einer Gleitkommazahl zu runden, verwendest du Funktionen aus dem Modul Float (Float.round, Float.ceil, Float.floor). Um stattdessen eine Ganzzahl zu erhalten, verwendest du Funktionen aus dem Modul Kernel (round, ceil, floor).
Eine weitere Möglichkeit, eine Gleitkommazahl in eine Ganzzahl umzuwandeln, ist das Abschneiden des Nachkommateils mit trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5