Квадратный корень в 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 () всегда возвращает float. Использование функции 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  )

возвращает квадратный корень из arg .


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

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}

потому что он всегда возвращает float:

float sqrt(float $arg)

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

intval(sqrt(16));

EDIT, Ok тогда:

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