Квадратный корень в PHP

Почему вывод 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 без использования регулярных выражений?

6 ответов

Решение

Согласно руководству по 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.

http://us2.php.net/sqrt

 float sqrt  ( float $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 для отрицательного целого числа.

Другие вопросы по тегам