Вопрос
Почему вывод sqrt
не целое число для «16» в PHP?
Пример
php > $fig = 16;
php > $sq = sqrt($fig); //should be 4
php > echo $sq;
4
php > echo is_int($sq); // should give 1, but gives false
php >
Я чувствую, что проблема во внутреннем представлении, которое PHP скрывает так же, как Python.Как же тогда узнать, является ли данная цифра целым числом после извлечения квадратного корня?
Так как же можно отличить 4
и 4.12323
в PHP без использования регулярного выражения?
Решение
Согласно руководству PHP, float sqrt ( float $arg )
, sqrt() всегда возвращает число с плавающей запятой.Использование функции is_int() не решит проблему, поскольку она проверяет тип данных и возвращает ошибку.
Чтобы обойти это, вы можете проверить это, используя вместо этого модуль:(должен быть fmod() для модуля с плавающей запятой, а не оператор % для целочисленного модуля)
if (fmod(sqrt(16), 1) == 0) {
// is an integer
}
Если вы используете PHP 5.2.0 или более позднюю версию, я считаю, что это также сработает, но я не использовал его в подобных обстоятельствах, чтобы быть уверенным:
$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
// is an integer
}
Другие советы
Нет, это не целое число. Это поплавок.
Об этом прямо в API сказано, тип возвращаемого значения — с плавающей запятой.
float sqrt ( float $arg )
Возвращает квадратный корень из arg.
Вы можете использовать функцию Floor, чтобы получить целую часть значения и вычесть исходное значение.Если разница != 0, то это НЕ целое число.например
if (($sq - floor($sq)) == 0){
YES
}else{
NO
}
Потому что он всегда возвращает число с плавающей запятой:
float sqrt(float $arg)
Если хотите, вы можете преобразовать его в целое число:
intval(sqrt(16));
РЕДАКТИРОВАТЬ, хорошо, тогда:
$sqrt = sqrt(16);
if (strpos($sqrt, '.') !== false)
{
$sqrt = intval($sqrt);
}
else
{
$sqrt = floatval($sqrt);
}
var_dump($sqrt);
Другой способ проверить целые числа — привести к строке и проверить ее с помощью ctype_digit()
$result = sqrt(16);
if (ctype_digit((string)$result)) {
// is an integer
}
Конечно, это несколько странный способ по сравнению с использованием модуля по модулю, когда вы все равно выполняете вычисления.Но это удобно при тестировании значений, отправленных из формы, поскольку изначально они будут строками. Предостережение: для отрицательного целого числа оно вернет false.