Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

PHP целые числа, числа с плавающей точкой и числовые строки

by
Difficulty:BeginnerLength:MediumLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

Работа с числами на 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, будет храниться как float, даже если оно выглядит как целое число.

Как правило, вы ожидаете, что результат умножения двух переменных типа int будет иметь тип int. Однако это не так в случае переполнения. Умножение пяти или шести разных чисел может легко вывести вас за пределы типа int. Например, результат 128*309*32*43*309 - это float в моей системе, потому что он превышает значение PHP_INT_MAX, которое равно 2147483647.

Вы можете использовать функцию is_int($value), чтобы проверить, имеет ли число целочисленный тип. Существует два псевдонима этой функции: is_integer($value) и is_long($value). Обе они дадут один и тот же результат.

Числа с плавающей точкой

Следующий наиболее распространенный тип числа, с которым вы будете иметь дело, - это float. В отличие от целых чисел, которые в большинстве случаев были просто числами без десятичных точек, ряд типов float может быть представлен различными способами. Значения 3.14, 12.0, 5.87E+10 и 3.56E-5 - все это числа с плавающей точкой.

PHP автоматически преобразует число в тип float, когда используются десятичные или очень большие числа. Тип float обычно может хранить числа с величиной, приблизительно равной 1.7976931348623E+308. Однако это зависит от платформы.

Значение 1.7976931348623E+308 может показаться очень большим значением - и это так! - но числа с плавающей точкой имеют максимальную точность всего около 14 цифр. Любое число с большим количеством цифр, чем это, потеряет свою точность. Это означает, что вы можете хранить очень большое число, но вы не сможете хранить информацию о его точном значении - во многих случаях float является лишь приблизительным.

Существуют две функции, которые могут использоваться для определения того, является ли значение, с которым вы имеете дело, с плавающей точкой. Этими функциями являются 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 обозначает Not a Number, но не проверяет, является ли значение числовым или нет. Значение 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 будет неявно использовать любую действительную числовую строку для числа, когда возникнет необходимость. Следующие примеры помогут вам лучше понять этот процесс.

Как вы можете видеть, вся действительная числовая строка была преобразована в их соответствующие значения перед добавлением или другими операциями. Тип $num в конце зависит от его конечного значения.

В последнем случае шестнадцатеричная строка "0xfedd24" не преобразуется в ее десятичное значение, потому что PHP 7 не считает ее допустимой числовой строкой.

Приведение строк и чисел с плавающей точкой к целым числам

Время от времени вам будет нужно перевести один тип числовых значений в другой. PHP имеет множество функций и методов для этого. В большинстве случаев приведение будет неявным, и вам не придется беспокоиться об этом. Однако, если вам нужно сделать преобразование, методы, упомянутые здесь, определенно помогут.

Вы можете использовать (int) или (integer) для преобразования любого значения в целое число. В случае float значения всегда будут округлены до нуля. Другой способ преобразовать строки и float в целые числа - с помощью функции intval(). Обе функции (int) и intval() работают одинаково.

Следует отметить, что при переполнении строк для целых чисел конечное значение будет устанавливаться в максимально допустимое целочисленное значение. Однако приведение значения float, значение которого превышает максимально допустимое целочисленное значение, приведет к колебанию значения между -2147483648 и 2147483647!

В определенных ситуациях вам может понадобиться иметь дело с очень большими числами, не теряя при этом никакой точности. Например, невозможно получить точный результат умножения 987233498349834828 и 3487197512 с помощью оператора *. Это даст вам 3.4426781992086E+27 после конвертации float. Вычисление фактического ответа, которое составляет 3442678199208600117812547936, потребует использования библиотек, таких как BCMath. BCMath работает, сохраняя числа как строки и выполняя арифметические операции над ними вручную. Просто помните, что если вы используете BCMath, вы будете иметь дело со строками вместо целых чисел и чисел с плавающей точкой.

Некоторые библиотеки хотят, чтобы вы передавали только числа типа int их методам, но вы могли бы неосознанно предоставить им значение float. Это может произойти, потому что значение float без десятичной части похоже на int. Это почти наверняка приведет к ошибке, если библиотека использует такую функцию, как is_int(), чтобы проверить, имеет ли переданный параметр целочисленный тип. В таких случаях всегда полезно сначала указать это число в int, используя либо (int), либо intval(), а затем передать его любым функциям или методам библиотеки.

Пример того, когда такая ситуация может возникнуть, - это когда вы имеете дело с математическими функциями, такими как floor() и ceil() и т. д. floor() и ceil() всегда возвращают float, даже если вы передадите им int!

Одной из проблем приведения плавающих чисел в целые является то, что вы потеряете десятичную часть чисел. Это может быть или не быть желательным. В таких случаях вы можете использовать такие функции, как floor(), и только отбрасывать число до типа int, если его фактическое значение равно значению, возвращаемому floor().

Допустим, у вас есть библиотека, которая позволяет выполнять дробную арифметику и выдает исключения, когда вы передаете число ее методу setNumerator(), которое не относится к типу int. Множество операций может превращать число в тип float, даже если оно по-прежнему является целым числом в пределах минимальной и максимальной границ типа int. Использование чего-то вроде приведенного выше кода поможет вам легко справиться с такими случаями.

Заключительные мысли

В этом руководстве рассмотрены различные способы, которыми PHP хранит числа и как вы можете определить тип переменной. Например, вы можете использовать такие функции, как is_int() и is_float(), чтобы определить тип числа и действовать соответствующим образом.

Как вы видели в учебнике, PHP поддерживает автоматическое преобразование типов. Это означает, что иногда меньшие целые числа, такие как 5 или 476, могли быть сохранены как плавающие без вашего понимания. Использование этих чисел в функциях, которые принимают только значения int, могут приводить к исключениям или ошибкам. Мы узнали, что простым решением этой проблемы является прямое преобразование таких чисел в int, если они не имеют десятичной части, и их значения не изменяются при приведении.

После прочтения этого урока вы сможете определить тип числа или конечный тип результата после использования различных операций с использованием предопределенных функций, а также явно передать их определенному типу после выполнения некоторых проверок.

Как всегда, если у вас есть какие-либо вопросы или дополнительные советы, вы можете оставить комментарий.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.