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