Existem dois tipos diferentes de números em Elixir: inteiros e números de ponto flutuante.
Números de ponto flutuante são números com um ou mais dígitos depois do separador decimal. Eles usam o formato de ponto flutuante de precisão dupla de 64 bits.
float = 3.45
# => 3.45
Elixir também oferece suporte à notação científica para números de ponto flutuante.
1.25e-2
# => 0.0125
Os números de ponto flutuante são famosos por seus erros de arredondamento.
0.1 + 0.2
# => 0.30000000000000004
No entanto, esse tipo de erro não é exclusivo do Elixir. Ele acontece em todas as linguagens de programação. Isso acontece porque todos os dados nos nossos computadores são armazenados e processados como código binário. Em binário, só podem ser representadas exatamente as frações cujo denominador pode ser expresso como 2^n (por exemplo, 1/4, 3/8, 5/16). As outras frações são representadas como estimativas.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Você pode saber mais sobre esse problema em 0.30000000000000004.com. A página do Float Toy tem uma explicação gráfica bacana de como os bits de um número de ponto flutuante são convertidos em um valor de ponto flutuante de verdade.
Inteiros e números de ponto flutuante podem ser considerados iguais (==) se tiverem o mesmo valor. No entanto, como são tipos diferentes, nunca são estritamente iguais (===).
1 == 1.0
# => true
1 === 1.0
# => false
Inteiros e números de ponto flutuante podem ser misturados em uma mesma expressão aritmética. Usar um número de ponto flutuante em uma expressão garante que o resultado também será um número de ponto flutuante.
2 * 3
# => 6
2 * 3.0
# => 6.0
Números de ponto flutuante podem ser arredondados (round), arredondados para cima (ceil) ou arredondados para baixo (floor).
Para arredondar um número de ponto flutuante e obter outro número de ponto flutuante, use as funções do módulo Float (Float.round, Float.ceil, Float.floor). Para obter um inteiro, use as funções do módulo Kernel (round, ceil, floor).
Outra forma de transformar um número de ponto flutuante em um inteiro é cortar a parte decimal com trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5