PHP: Числа
- Целые числа
- Числа с плавающей точкой
- Ошибки округления чисел c плавающей точкой
- Специальное значение NAN
Целые числа
Значениями типа integer
являются целые числа. Целые числа могут быть указаны в десятичной, шестнадцатеричной, восьмеричной или двоичной системе счисления, с необязательным предшествующим знаком (+ или -).
Для записи в шестнадцатеричной системе счисления, перед числом необходимо поставить 0x. Для записи в восьмеричной системе счисления, перед числом необходимо поставить 0 (нуль). Для записи в двоичной системе счисления, перед числом необходимо поставить 0b:
1224 -123 0123 0x1A 0b111011
Числа с плавающей точкой
Значениями типа float (double)
являются числа с плавающей точкой:
1.2 0.032
Числа с плавающей точкой также можно представлять в виде экспоненциальной записи. Экспоненциальная запись означает число, умноженное на 10 в указанной степени. Экспоненциальная запись состоит из числа, за которым ставится прописная или строчная буква E, после которой можно поставить необязательный знак + или - и далее показатель степени числа 10:
$num1 = 3.52e5; // 352000 $num2 = 7E-4; // 0.0007 echo $num1, "<br>"; echo $num2;
PHP автоматически переводит в экспоненциальную запись любые числа с плавающей точкой, содержащие как минимум четыре нуля после точки:
echo 0.00007; // 7E-5
Ошибки округления чисел c плавающей точкой
Двоичное представление чисел с плавающей точкой неспособно обеспечить их точность. Двоичное представление чисел c плавающей точкой в PHP определяется согласно стандарту IEEE-754
. Факт того, что число c плавающей точкой не может быть представлено точно, может приводить к проблемам, например при сравнении этих чисел:
$x = 0.3 - 0.2; $y = 0.2 - 0.1; echo ($x == $y), "<br>"; // false echo ($x == 0.1), "<br>"; // false echo ($y == 0.1); // true
Эта проблема не является чем-то характерным для PHP, она проявляется во всех языках программирования, где используется двоичное представление чисел с плавающей точкой. Если необходима высокая точность представления чисел с плавающей точкой, нужно использовать математические функции произвольной точности:
$x = bcsub(0.3, 0.2, 1); $y = bcsub(0.2, 0.1, 1); echo ($x == $y), "<br>"; // true echo ($x == 0.1), "<br>"; // true echo ($y == 0.1); // true
Специальное значение NAN
Некоторые функции при работе с числами могут возвращать специальное значение NAN
. Данное значение означает, что какая-то используемая математическая функция вышла за пределы допустимого диапазона значений в операциях с плавающей точкой или не смогла обработать свои входные данные. Значение NAN
является сокращением от Not a Number (не число):
$nan = acos(8); echo $nan;
Значение NAN
обладает одной особенностью — оно не равно никакому значению, в том числе и другому NAN
. Это значит, что нельзя использовать проверку $nan == NAN
, чтобы определить, является ли значение переменной $nan
значением NAN
. Вместо этого следует выполнить проверку $nan != $nan
. Эта проверка вернёт TRUE
тогда и только тогда, когда $nan
имеет значение NAN
. Аналогичную проверку можно выполнить с помощью функции is_nan()
. Она возвращает TRUE
, только если аргумент имеет значение NAN
.
Помимо этого, любая арифметическая операция с NAN
, например, NAN / 10
всегда возвращает NAN
.
С этой темой смотрят: