Квадратный корень в PHP - PullRequest
7 голосов
/ 31 октября 2009

Почему вывод 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 ]

16 голосов
/ 31 октября 2009

Согласно руководству по 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
}
9 голосов
/ 31 октября 2009

Нет, это не целое число. Это поплавок .

5 голосов
/ 31 октября 2009

Говорит прямо в API, тип возвращаемого значения - float.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Возвращает квадратный корень из аргумента.

3 голосов
/ 31 октября 2009

Вы можете использовать функцию floor, чтобы получить целую часть значения и вычесть исходное значение. Если разница равна! = 0, то это НЕ целое число. например,

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}
2 голосов
/ 31 октября 2009

Потому что он всегда возвращает число с плавающей запятой:

float sqrt(float $arg)

Вы можете привести его к целому числу, если хотите:

intval(sqrt(16));

РЕДАКТИРОВАТЬ, ОК, тогда:

$sqrt = sqrt(16);

if (strpos($sqrt, '.') !== false)
{
    $sqrt = intval($sqrt);
}

else
{
    $sqrt = floatval($sqrt);
}

var_dump($sqrt);
0 голосов
/ 31 октября 2009

Другим способом проверки целых чисел будет приведение к строке и проверка этого с помощью ctype_digit()

$result = sqrt(16);
if (ctype_digit((string)$result)) {
   // is an integer
}

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

...