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.
С этой темой смотрят: