Десятковий дріб (float)
Десятковий дріб - число з рухомою крапкою (також відоме як "float", "double"
чи "real") може записуватись одним зі способів:
Формально, починаючи з PHP 7.4.0 (до того знак підкреслення не був дозволений):
Розмір десяткового дробу залежить від платформи, хоча зазвичай, максимальне
значення дорівнює приблизно 1.8e308 з точністю заокругленою до 14 десяткових
цифр (на 64-бітних системах використовується формат IEEE).
Увага
Точність десяткового дробу
Числа з рухомою точкою мають обмежену точність. Хоча це залежить від
операційної системи, зазвичай PHP використовує формат подвійної точності IEEE
754, який дає максимальну відносну похибку заокруглення 1.11e-16. Не
елементарні арифметичні операції можуть давати більшу похибку, що необхідно
враховувати, бо збільшення кількості операцій при обрахунку підсилює цей
ефект.
Окрім того, раціональні числа, які представлені саме як числа з рухомою
крапкою з основою 10, такі як 0.1
чи
0.7
, не мають точного представлення у вигляді чисел з
рухомою крапкою з основою 2, незалежно від розміру мантиси (для довідки: PHP
використовує основу 2 для внутрішніх обрахунків). Отже, вони не можуть бути
конвертовані в їхні внутрішні відповідники з основою 2, без невеликих втрат
точності. Ця особливість може призводити до заплутаних результатів:
наприклад, floor((0.1+0.7)*10)
за звичай буде повертати
7
, а не очікуване 8
, оскільки
внутрішнє представлення буде приблизно таким
7.9999999999999991118...
.
Не можна довіряти десятковим дробам до останньої цифри та порівнювати їх
безпосередньо. Якщо необхідна висока точність, можна скористатись функціями з довільною математичною
точністю та функціями gmp.
"Просте" пояснення можна продивитись тут:
» Довідка щодо чисел з рухомою
крапкою.
Перетворення в десятковий дріб
Рядки
Якщо рядок є
числовим
або починається з числа, то його можна перетворити в відповідний десятковий
дріб, а інакше в нуль (0
).
Інші типи
Для значень інших типів перетворення виконується спершу в int,
а потім з цілого в float. Докладніше:
Перетворення в ціле
число.
Зауваження:
Оскільки деякі типи мають невизначену поведінку під час перетворення на
int, це також стосується перетворення на float.
Порівняння десяткових дробів
Як записано вгорі в застережені, перевірка на рівність десяткових дробів є
проблематичною в зв'язку зі специфікою їхньої будови. Тим не менш, існують
способи здійснювати порівняння десяткових дробів, обходячи згадані обмеження.
Для порівняння десяткових дробів використовується верхня межа відносної
похибки для заокруглення. Це значення відоме як машинний нуль (чи машинний
епсилон, або ж міра заокруглення), та є найменшою різницею, що приймається
при розрахунках.
NaN
Деякі числові операції можуть мати результат зі значенням костанти
NAN
. Такі результати представляють невизначені або
невідображувані значення чисел з рухомою крапкою. Будь-які м'які чи строгі
порівняння цих значень з іншими значеннями, включаючи їх самих, окрім true
,
будуть мати в результаті хибне значення (false
).
Оскільки NAN
представляє собою число з будь-якими
значеннями, NAN
не можна порівнювати з іншими
значеннями, включаючи їх самих. Визначити наявність в результаті значення
NAN можна за допомогою функції is_nan().