Вопрос

Почему вывод 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 сказано, тип возвращаемого значения — с плавающей запятой.

http://us2.php.net/sqrt

 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top