Числа с плавающей точкой
Числа с плавающей точкой или числа с плавающей запятой (известные также как «float», «double» или «real»)
можно определить следующими синтаксисами:
]]>
Формально начиная с PHP 7.4.0 (ранее подчёркивание не разрешалось):
Размер числа с плавающей точкой зависит от платформы, хотя максимум, как правило,
составляет 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.9999999999999991118....
Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры
и не проверяйте напрямую их равенство.
Если вам действительно необходима высокая точность, используйте
математические функции произвольной точности и
gmp-функции.
«Простое» объяснение можно найти в руководстве
по числам с плавающей точкой, которое также называется
«Why don’t my numbers add up?» («Почему мои числа не складываются?» — англ.)
Преобразование в число с плавающей точкойИз строк
Если строка
содержит число
или ведущую числовую последовательность, тогда она будет преобразована в соответствующее значение с плавающей точкой,
в противном случае она преобразуется в ноль (0).
Из других типов
Для значений других типов преобразование выполняется путём преобразования значения сначала в целое число (int), а затем в число с плавающей точкой ( float ).
Смотрите Преобразование в целое число для получения
дополнительной информации.
Поскольку определённые типы имеют неопределённое поведение при преобразовании в
целое число (int), то же самое происходит и при преобразовании в
число с плавающей точкой (float).
Сравнение чисел с плавающей точкой
Как указано выше, проверять числа с плавающей точкой на равенство
проблематично из-за их внутреннего представления.
Тем не менее, существуют способы для их сравнения, которые работают
несмотря на все эти ограничения.
Для сравнения чисел с плавающей точкой используется верхняя граница
относительной ошибки при округлении. Эта величина называется
машинной эпсилон или единицей округления (unit roundoff) и
представляет собой самую маленькую допустимую разницу при расчётах.
$a и $b равны до 5-ти
знаков после точки.
]]>
NaN
Некоторые числовые операции могут возвращать значение, представляемое
константой NAN. Данный результат означает неопределённое
или непредставимое значение в операциях с плавающей точкой. Любое строгое
или нестрогое сравнение данного значения с другим значением, кроме &true;, включая его
самого, возвратит &false;.
Так как NAN представляет собой неограниченное количество
различных значений, то NAN не следует сравнивать с
другими значениями, включая её саму. Вместо этого, для определения её наличия
необходимо использовать функцию is_nan.