В Elixir є два різні типи чисел: цілі числа та числа з плаваючою комою.
Числа з плаваючою комою мають одну або більше цифр після десяткового розділювача. Вони використовують 64-бітний формат з плаваючою комою подвійної точності.
float = 3.45
# => 3.45
Elixir також підтримує наукову нотацію для чисел з плаваючою комою.
1.25e-2
# => 0.0125
Числа з плаваючою комою відомі своїми помилками округлення.
0.1 + 0.2
# => 0.30000000000000004
Однак такі помилки не є особливістю Elixir. Вони трапляються в усіх мовах програмування. Це тому, що всі дані в наших компʼютерах зберігаються й обробляються як двійковий код. У двійковій системі точно можна подати лише ті дроби, знаменник яких можна виразити як 2^n (наприклад, 1/4, 3/8, 5/16). Інші дроби подаються як наближення.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
Дізнатися більше про цю проблему можна на 0.30000000000000004.com. На сторінці Float Toy є гарне графічне пояснення того, як біти числа з плаваючою комою перетворюються на фактичне значення з плаваючою комою.
Цілі числа та числа з плаваючою комою можна вважати рівними (==), якщо вони мають однакове значення. Однак, оскільки це різні типи, вони ніколи не є строго рівними (===).
1 == 1.0
# => true
1 === 1.0
# => false
Цілі числа та числа з плаваючою комою можна змішувати в одному арифметичному виразі. Якщо у виразі використати число з плаваючою комою, результат теж буде числом з плаваючою комою.
2 * 3
# => 6
2 * 3.0
# => 6.0
Числа з плаваючою комою можна округлити (round), округлити вгору (ceil) або округлити вниз (floor).
Щоб округлити число з плаваючою комою й отримати число з плаваючою комою, можна скористатися функціями з модуля Float (Float.round, Float.ceil, Float.floor). Щоб натомість отримати ціле число, можна скористатися функціями з модуля Kernel (round, ceil, floor).
Ще один спосіб перетворити число з плаваючою комою на ціле число - відкинути його дробову частину за допомогою trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5