Floating point numbers

Оновлено: 11.05.2023

Числа з плаваючою комою (також відомі як "плаваючі", "подвійні" або "дійсні числа") можна вказати за допомогою будь-якого з наведених нижче синтаксисів:

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // as of PHP 7.4.0
?>

Формально починаючи з PHP 7.4.0 (раніше підкреслення не дозволялося):

Розмір float залежить від платформи, хоча максимальне значення приблизно 1.8e308 з точністю до 14 десяткових знаків є загальним (64-розрядний формат IEEE).

Числа з плаваючою комою мають обмежену точність. Хоча це залежить від системи, PHP зазвичай використовує формат подвійної точності IEEE 754, який дає максимальну відносну похибку через округлення порядку 1.11e-16. Неелементарні арифметичні операції можуть давати більші помилки, і, звичайно, слід враховувати поширення помилок при складанні декількох операцій.

Крім того, раціональні числа, які можна точно представити як числа з плаваючою комою в основі 10, наприклад, 0.1 або 0.7, не мають точного представлення як числа з плаваючою комою в основі 2, яка використовується всередині системи, незалежно від розміру мантиси. Отже, вони не можуть бути перетворені у свої внутрішні двійкові аналоги без невеликої втрати точності. Це може призвести до заплутаних результатів: наприклад, floor((0.1+0.7)*10) зазвичай повертає 7 замість очікуваного 8, оскільки внутрішнє представлення буде чимось на зразок 7.99999999999999999991118....

Тому ніколи не довіряйте результатам обчислень з плаваючою комою до останньої цифри і не порівнюйте числа з плаваючою комою безпосередньо на рівність. Якщо потрібна вища точність, доступні математичні функції довільної точності та gmp-функції.

Для "простого" пояснення див. " посібник з плаваючою комою, який також називається "Чому мої числа не складаються?".

Якщо рядок є числовим або ведучим числом, то він буде перетворений у відповідне значення з плаваючою комою, інакше він буде перетворений у нуль (0).

Для значень інших типів перетворення виконується шляхом перетворення значення спочатку до типу int, а потім до типу float. Докладнішу інформацію див. у розділі Перетворення в ціле число.

Зауважте:

Оскільки деякі типи мають невизначену поведінку при перетворенні до типу int, це стосується і перетворення до типу float.

Як зазначено у попередженні вище, перевірка значень з плаваючою комою на рівність є проблематичною через спосіб їх внутрішнього представлення. Однак існують способи порівняння значень з плаваючою комою, які дозволяють обійти ці обмеження.

Для перевірки значень з плаваючою комою на рівність використовується верхня межа відносної похибки через округлення. Це значення відоме як машинний епсилон, або одиничне округлення, і є найменшою допустимою різницею в обчисленнях.

$a та $b дорівнюють 5 знакам після коми.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

Деякі числові операції можуть призвести до отримання значення, представленого константою NAN. Цей результат є невизначеним або непредставленим значенням в обчисленнях з плаваючою комою. Будь-яке нестроге або строге порівняння цього значення з будь-яким іншим значенням, включно із самим собою, але крім true, матиме результат false.

Оскільки NAN представляє будь-яку кількість різних значень, NAN не слід порівнювати з іншими значеннями, в тому числі з самим собою, натомість слід перевіряти його наявність за допомогою is_nan().