Em Elixir há dois tipos diferentes de números: os números inteiros e os números de vírgula flutuante.
Os números de vírgula flutuante são números com um ou mais algarismos depois do separador decimal. Usam o formato de vírgula flutuante de precisão dupla de 64 bits.
float = 3.45
# => 3.45
O Elixir também suporta a notação científica para números de vírgula flutuante.
1.25e-2
# => 0.0125
Os números de vírgula flutuante têm má fama por causa dos seus erros de arredondamento.
0.1 + 0.2
# => 0.30000000000000004
No entanto, este tipo de erros não é específico do Elixir. Acontecem em todas as linguagens de programação. Isto deve-se ao facto de todos os dados nos nossos computadores serem armazenados e processados como código binário. Em binário, só é possível representar exatamente as frações cujo denominador pode ser escrito como 2^n (por exemplo, 1/4, 3/8, 5/16). As outras frações são representadas por aproximações.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Podes saber mais sobre este problema em 0.30000000000000004.com. A página Float Toy tem uma boa explicação gráfica de como os bits de um número de vírgula flutuante são convertidos num valor de vírgula flutuante concreto.
Os números inteiros e os números de vírgula flutuante podem ser considerados iguais (==) se tiverem o mesmo valor. No entanto, como são de tipos diferentes, nunca são estritamente iguais (===).
1 == 1.0
# => true
1 === 1.0
# => false
Os números inteiros e os números de vírgula flutuante podem ser misturados numa única expressão aritmética. Usar um número de vírgula flutuante numa expressão garante que o resultado também é um número de vírgula flutuante.
2 * 3
# => 6
2 * 3.0
# => 6.0
Os números de vírgula flutuante podem ser arredondados (round), arredondados por excesso (ceil) ou arredondados por defeito (floor).
Para arredondar um número de vírgula flutuante para outro número de vírgula flutuante, usa as funções do módulo Float (Float.round, Float.ceil, Float.floor). Para obteres um número inteiro, usa as funções do módulo Kernel (round, ceil, floor).
Outra forma de transformar um número de vírgula flutuante num número inteiro é cortar a parte decimal com trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5