En Elixir hay dos tipos diferentes de números: los enteros y los números de punto flotante.
Los números de punto flotante son números con uno o más dígitos detrás del separador decimal. Usan el formato de punto 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 de punto flotante.
1.25e-2
# => 0.0125
Los números de punto flotante son famosos 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 en nuestras computadoras se almacenan y se procesan como código binario. En binario, solo se pueden expresar con exactitud las fracciones cuyo denominador se puede expresar 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 aprender más sobre este problema en 0.30000000000000004.com. La página Float Toy tiene una explicación gráfica muy buena de cómo los bits de un número de punto flotante se convierten en un valor de punto flotante real.
Los enteros y los números de punto flotante se pueden considerar iguales (==) si tienen el mismo valor. Sin embargo, al ser de tipos diferentes, nunca son estrictamente iguales (===).
1 == 1.0
# => true
1 === 1.0
# => false
Los enteros y los números de punto flotante se pueden mezclar en una sola expresión aritmética. Usar un número de punto flotante en una expresión garantiza que el resultado también sea un número de punto flotante.
2 * 3
# => 6
2 * 3.0
# => 6.0
Los números de punto flotante se pueden redondear (round), redondear hacia arriba (ceil) o redondear hacia abajo (floor).
Para redondear un número de punto flotante y obtener otro número de punto flotante, 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 de punto flotante en un entero es cortar su parte decimal con trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5