Работа с числами в PHP кажется тривиальной концепцией, но она может быть довольно запутанной. Сначала это выглядит просто, потому что PHP обеспечивает автоматическое преобразование типов. Например, вы можете назначить целочисленное значение переменной, и тип этой переменной будет целым числом. На следующей строке вы можете присвоить строку той же переменной, и тип изменится на строку. К сожалению, это автоматическое преобразование может иногда нарушать ваш код.
Есть также много типов для числовых значений. В этом руководстве вы узнаете о целых числах и числах с плавающей запятой в PHP, а также о функциях, которые можно использовать для определения типа чисел, с которыми мы имеем дело, и преобразования между ними. Вы также узнаете, как преобразовывать целые числа и числа с плавающей точкой в числовые строки.
Различные типы чисел в PHP
Целые
Основным типом числа в PHP является целое число. Как вы уже знаете, целые числа — это числа без десятичной части. Например, 2 — это целое число, а также 235298 или -235298. С другой стороны, 2,0 и 3,58 являются поплавками. Мы обсудим их более подробно позже.
Следует помнить одну важную вещь: необязательно, чтобы число было типа int
если оно не имеет десятичной части. Например, 16 * 2.5
— это ровно 40
, но тип этого результата все еще будет с float
. Когда вы умножаете числа, конечный результат будет иметь тип float, если хотя бы один из операндов был float. Неважно, если конечное число имеет десятичную часть или нет.
Кроме того, максимально возможное значение, которое может иметь целое число в PHP в вашей системе, можно получить с помощью константы PHP_INT_MAX
. Значение, большее по величине, чем значение, возвращаемое PHP_INT_MAX
будет сохранено как число с плавающей запятой, даже если оно выглядит как целое число.
Как правило, можно ожидать, что результат умножения двух переменных типа int
будет иметь тип int
. Однако это не так в случае переполнения. Умножение пяти или шести различных чисел может легко вывести вас за пределы типа int
. Например, результат 128*309*32*43*309
— это число с плавающей запятой в моей системе, поскольку оно превышает значение PHP_INT_MAX
, PHP_INT_MAX
2147483647
.
Вы можете использовать is_int($value)
чтобы проверить, имеет ли число тип integer. У этой функции есть два псевдонима: is_integer($value)
и is_long($value)
. Оба они дадут одинаковый результат.
Поплавки
Следующим наиболее распространенным типом чисел, с которым вы будете иметь дело, является число с плавающей точкой. В отличие от целых чисел, которые в большинстве случаев были просто числами без десятичных точек, число с float
может быть представлено различными способами. Значения 3.14
, 12.0
, 5.87E+10
и 3.56E-5
— все значения с плавающей точкой.
PHP автоматически преобразует число в тип с float
запятой всякий раз, когда используются десятичные или очень большие числа. Тип с float
обычно может хранить числа с величиной, приблизительно равной 1.7976931348623E+308
. Однако это зависит от платформы.
Значение 1.7976931348623E+308
может показаться очень большим значением — и это так! — но значения с плавающей точкой имеют максимальную точность всего около 14 цифр. Любое число с большим количеством цифр потеряет свою точность. Это означает, что вы можете хранить очень большое число, но вы не сможете хранить информацию о его точном значении — во многих случаях число с плавающей точкой является лишь приблизительным.
Есть две функции, которые можно использовать, чтобы определить, является ли значение, с которым вы имеете дело, плавающей точкой. Это функции is_float()
и is_double()
. На самом деле is_double()
— это просто псевдоним is_float()
, поэтому вы можете использовать любой из них и получить тот же результат.
Бесконечность и NaN
Есть еще два вида числовых значений, с которыми вам, возможно, придется иметь дело при написании программ, связанных с математикой. Эти значения равны бесконечности и NaN
(не число). Оба эти значения требуют небольшого объяснения, потому что они отличаются от того, что вы могли ожидать.
Бесконечность в PHP отличается от бесконечности в реальной жизни. В PHP любое числовое значение выше приблизительно PHP_FLOAT_MAX
на платформе считается бесконечностью. Так что 1.8e308
даст вам float(INF)
для var_dump()
. Вы можете проверить, является ли числовое значение конечным или бесконечным, используя функции is_finite()
и is_infinite()
.
Точно так же, NaN
означает N не номер , но он не проверяет, является ли значение числовым или нет. Значение NaN
используется для результата математических операций, которые невозможны в математике. Например, log(-1)
будет NaN
. Так же, acos(5)
также будет NaN
. Вы можете проверить, является ли значение, возвращаемое математической операцией, не числом, используя функцию is_nan()
.
Числовые строки в PHP
Подобно тому, как PHP динамически меняет тип различных чисел на основе того, как их значения используются или присваиваются, он также может выводить значения различных числовых строк для преобразования их в числа.
Функция is_numeric()
может помочь вам определить, является ли строка или переменная действительно числовой или нет. Эта функция вернет true
для чисел, записанных в восьмеричной, двоичной или шестнадцатеричной записи. Он также вернет true
если числа записаны в экспоненциальной записи, например, +16.52e39
.
Начиная с PHP 7.0.0, когда вы передаете строку в is_numeric()
, она возвращает true
, только если строка состоит из необязательного знака, нескольких цифр, необязательного десятичного числа и необязательной экспоненциальной части. Это означает, что числовая строка, написанная в шестнадцатеричном или двоичном формате, вернет false
из PHP 7.0.0 и далее.
PHP будет неявно приводить любую допустимую числовую строку к числу, когда возникнет такая необходимость. Следующие примеры должны помочь вам лучше понять этот процесс.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?php
$num = «3258712» + 12380;
// Output: int(3271092)
var_dump($num);
$num = «3258712» + «12380»;
// Output: int(3271092)
var_dump($num);
$num = 3258712 + «12380»;
// Output: int(3271092)
var_dump($num);
$num = 3258712 * «12380»;
// Output: float(40342854560)
var_dump($num);
$num = 3258712 / «12380»;
// Output: float(263.2239095315)
var_dump($num);
$num = 3258712 / «8»;
// Output: int(407339)
var_dump($num);
$num = «53.9e4» + 10;
// Output: float(539010)
var_dump($num);
$num = «398.328» + 10;
// Output: float(408.328)
var_dump($num);
$num = «398328» + 0xfedd24;
// Output: int(17101084)
var_dump($num);
$num = 398328 + «0xfedd24»;
// Output: int(398328)
var_dump($num);
?>
|
Как видите, все действительные числовые строки были преобразованы в соответствующие значения до того, как были выполнены сложение или другие операции. Тип $num
в конце зависит от его окончательного значения.
В последнем случае шестнадцатеричная строка «0xfedd24» не преобразуется в свое десятичное значение, поскольку PHP 7 не считает ее допустимой числовой строкой.
Приведение строк и чисел к целым числам
Время от времени вам нужно будет преобразовывать один тип числового значения в другой. PHP имеет множество функций и методов для этого. В большинстве случаев преобразование будет неявным, и вам не придется об этом беспокоиться. Однако, если вам нужно сделать преобразование явно, методы, упомянутые здесь, определенно помогут.
Вы можете использовать (int)
или (integer)
чтобы преобразовать любое значение в целое число. В случае с плавающей точкой значения всегда будут округлены до нуля. Другой способ приведения строк и чисел к целым числам — с помощью функции intval()
. Оба (int)
и intval()
работают одинаково.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
$float_a = 3598723.8258;
$int_cast = (int)$float_a;
// Output: 3598723
echo $int_cast;
$string_a = «98723.828»;
$int_cast = (int)$string_a;
// Output: 98723
echo $int_cast;
$string_b = «987233498349834828»;
$int_cast = (int)$string_b;
// Output: 2147483647
echo $int_cast;
$float_b = 21474836473492789;
$int_cast = (int)$float_b;
// Output: -6507212
echo $int_cast;
?>
|
Следует отметить, что приведение строк с переполнением к целым числам установит конечное значение максимально допустимого целочисленного значения. Однако приведение числа с плавающей точкой, значение которого превышает максимально допустимое целочисленное значение, приведет к колебанию значения между -2147483648
и 2147483647
!
В определенных ситуациях вам, возможно, придется иметь дело с очень большими числами без потери точности. Например, невозможно получить точный результат умножения 987233498349834828
и 3487197512
с помощью оператора *
. Это даст вам 3.4426781992086E+27
после конвертации с плавающей точкой. Вычисление фактического ответа 3442678199208600117812547936
потребует использования таких библиотек, как BCMath . BCMath работает, сохраняя числа в виде строк и выполняя арифметические операции над ними вручную. Просто помните, что если вы используете BCMath, вы будете иметь дело со строками вместо целых и с плавающей точкой.
Некоторые библиотеки хотят, чтобы вы передавали в методы только числа типа int
, но вы можете неосознанно предоставлять им значение с плавающей запятой. Это может произойти, потому что значение выглядит как int, потому что оно не имеет десятичной части. Это почти наверняка приведет к ошибке, если библиотека использует функцию наподобие is_int()
чтобы проверить, имеет ли переданное число целочисленный тип. В таких случаях всегда целесообразно сначала привести это число к int с помощью (int)
или intval()
а затем передать его любым функциям или методам библиотеки.
Одним из примеров возникновения такой ситуации может быть ситуация, когда вы имеете дело с математическими функциями, такими как floor()
, ceil()
и т. Д. floor()
и ceil()
всегда будут возвращать float, даже если вы передадите им int !
01
02
03
04
05
06
07
08
09
10
11
|
<?php
$int_a = 15*12;
// Output: int(180)
var_dump($int_a);
$num = floor($int_a);
// Output: float(180)
var_dump($num);
?>
|
Одной из проблем приведения чисел к целым числам является то, что вы потеряете десятичную часть чисел. Это может или не может быть желательным. В таких случаях вы можете использовать такие функции, как floor()
и приводить число к типу int только в том случае, если его фактическое значение равно значению, возвращенному floor()
.
01
02
03
04
05
06
07
08
09
10
11
12
|
<?php
$number = 16*2.5;
if(floor($number) == $number) {
$fraction->setNumerator((int)$number);
} else {
echo ‘Did not set the numerator.’;
doSomethingElse();
}
?>
|
Допустим, у вас есть библиотека, которая позволяет вам выполнять дробную арифметику, и она выдает исключения, когда вы передаете число в метод setNumerator()
который не имеет тип int. Различные операции могут превратить число в тип float, даже если оно все еще является целым числом в пределах минимальной и максимальной границ типа int. Использование чего-то вроде приведенного выше кода поможет вам легко справиться с такими случаями.
Последние мысли
В этом руководстве рассматриваются различные способы хранения чисел в PHP и способы определения числа определенного типа. Например, вы можете использовать функции, такие как is_int()
и is_float()
чтобы определить тип числа и действовать соответственно.
Как вы видели в руководстве, PHP поддерживает автоматическое преобразование типов. Это означает, что иногда меньшие целые числа, такие как 5
или 476
могли храниться как числа с плавающей запятой без вашего осознания этого. Использование этих чисел в функциях, которые принимают только значения int
может привести к исключениям или ошибкам. Мы узнали, что простым решением этой проблемы является явное приведение таких чисел к int
если они не имеют десятичной части и их значения не меняются при приведении.
Прочитав этот учебник, вы сможете определить тип числа или конечный тип результата после использования различных операций с предопределенными функциями, а также явным образом привести их к определенному типу после выполнения некоторых проверок.
Как всегда, если у вас есть какие-либо вопросы или дополнительные советы, вы можете прокомментировать.