In Elixir ci sono due tipi diversi di numeri: gli interi e i numeri in virgola mobile.
I numeri in virgola mobile sono numeri con una o più cifre dopo il separatore decimale. Usano il formato a virgola mobile a doppia precisione a 64 bit.
float = 3.45
# => 3.45
Elixir supporta anche la notazione scientifica per i numeri in virgola mobile.
1.25e-2
# => 0.0125
I numeri in virgola mobile sono famosi per i loro errori di arrotondamento.
0.1 + 0.2
# => 0.30000000000000004
Tuttavia, questo tipo di errori non è specifico di Elixir. Si verificano in tutti i linguaggi di programmazione. Questo perché tutti i dati sui nostri computer vengono memorizzati ed elaborati come codice binario. In binario, solo le frazioni il cui denominatore può essere espresso come 2^n (ad esempio 1/4, 3/8, 5/16) possono essere espresse esattamente. Le altre frazioni vengono espresse come stime.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Puoi saperne di più su questo problema su 0.30000000000000004.com. La pagina di Float Toy ha una bella spiegazione grafica di come i bit di un numero in virgola mobile vengono convertiti in un valore in virgola mobile effettivo.
Gli interi e i numeri in virgola mobile possono essere considerati uguali (==) se hanno lo stesso valore. Tuttavia, essendo di tipi diversi, non sono mai strettamente uguali (===).
1 == 1.0
# => true
1 === 1.0
# => false
Gli interi e i numeri in virgola mobile possono essere mescolati insieme in un'unica espressione aritmetica. Usare un numero in virgola mobile in un'espressione assicura che anche il risultato sarà un numero in virgola mobile.
2 * 3
# => 6
2 * 3.0
# => 6.0
I numeri in virgola mobile possono essere arrotondati (round), arrotondati per eccesso (ceil) o arrotondati per difetto (floor).
Per arrotondare un numero in virgola mobile ottenendo un numero in virgola mobile, usa le funzioni del modulo Float (Float.round, Float.ceil, Float.floor). Per ottenere invece un intero, usa le funzioni del modulo Kernel (round, ceil, floor).
Un altro metodo per trasformare un numero in virgola mobile in un intero è tagliare via la sua parte decimale con trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5