En Elixir hay dos tipos diferentes de números: los enteros y los números decimales.
Los números decimales son aquellos que tienen uno o más dígitos después del separador decimal. Utilizan el formato de coma flotante de doble precisión de 64 bits.
float = 3.45
# => 3.45
Elixir también admite la notación científica para los números decimales.
1.25e-2
# => 0.0125
Los números decimales tienen muy mala fama por sus errores de redondeo.
0.1 + 0.2
# => 0.30000000000000004
Sin embargo, ese tipo de errores no son exclusivos de Elixir. Ocurren en todos los lenguajes de programación. Esto se debe a que todos los datos de nuestros ordenadores se almacenan y se procesan como código binario. En binario, solo se pueden expresar con exactitud las fracciones cuyo denominador puede expresarse como 2^n (por ejemplo, 1/4, 3/8, 5/16). Las demás fracciones se expresan como estimaciones.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Puedes obtener más información sobre este problema en 0.30000000000000004.com. La página Float Toy tiene una buena explicación gráfica de cómo se convierten los bits de un número de coma flotante en un valor de coma flotante real.
Los enteros y los números decimales pueden considerarse iguales (==) si tienen el mismo valor. Sin embargo, como son de tipos diferentes, nunca son estrictamente iguales (===).
1 == 1.0
# => true
1 === 1.0
# => false
Los enteros y los números decimales se pueden mezclar en una misma expresión aritmética. Usar un número decimal en una expresión garantiza que el resultado también será un número decimal.
2 * 3
# => 6
2 * 3.0
# => 6.0
Los números decimales se pueden redondear (round), redondear hacia arriba (ceil) o redondear hacia abajo (floor).
Para redondear un número decimal y obtener otro número decimal, usa las funciones del módulo Float (Float.round, Float.ceil, Float.floor). Para obtener un entero en su lugar, usa las funciones del módulo Kernel (round, ceil, floor).
Otra forma de convertir un número decimal en un entero es cortar su parte decimal con trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5