Az Elixirben kétféle szám létezik: egész számok és lebegőpontos számok.
A lebegőpontos számok olyan számok, amelyekben a tizedeselválasztó után egy vagy több számjegy áll. A 64 bites, dupla pontosságú lebegőpontos formátumot használják.
float = 3.45
# => 3.45
Az Elixir a lebegőpontos számoknál a tudományos jelölést is támogatja.
1.25e-2
# => 0.0125
A lebegőpontos számok hírhedtek a kerekítési hibáikról.
0.1 + 0.2
# => 0.30000000000000004
Az ilyen hibák azonban nem az Elixir sajátjai. Minden programozási nyelvben előfordulnak. Ez azért van, mert a számítógépeinken minden adat bináris kódként tárolódik és dolgozódik fel. A bináris rendszerben csak azok a törtek ábrázolhatók pontosan, amelyeknek a nevezője 2^n alakban felírható (pl. 1/4, 3/8, 5/16). A többi tört csak közelítésként ábrázolható.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Erről a problémáról bővebben a 0.30000000000000004.com oldalon olvashatsz. A Float Toy oldal szép, grafikus magyarázatot ad arra, hogyan alakulnak át egy lebegőpontos szám bitjei tényleges lebegőpontos értékké.
Az egész számok és a lebegőpontos számok egyenlőnek tekinthetők (==), ha ugyanaz az értékük. Mivel azonban különböző típusok, soha nem szigorúan egyenlők (===).
1 == 1.0
# => true
1 === 1.0
# => false
Az egész és a lebegőpontos számok ugyanabban az aritmetikai kifejezésben keveredhetnek. Ha egy kifejezésben lebegőpontos szám szerepel, az eredmény is lebegőpontos lesz.
2 * 3
# => 6
2 * 3.0
# => 6.0
A lebegőpontos számokat kerekíthetjük (round), felfelé kerekíthetjük (ceil) vagy lefelé kerekíthetjük (floor).
Ha lebegőpontos számot szeretnél lebegőpontos számmá kerekíteni, használd a Float modul függvényeit (Float.round, Float.ceil, Float.floor). Ha inkább egész számot szeretnél kapni, használd a Kernel modul függvényeit (round, ceil, floor).
A lebegőpontos szám egész számmá alakításának egy másik módja, hogy levágjuk a tizedesrészét a trunc függvénnyel.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5