Pergunta

Por que é a saída do sqrt não um inteiro para "16" em PHP?

Exemplo

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 > 

Eu sinto que o problema está na apresentação interna que esconde PHP da mesma forma como Python. Como você pode, então, saber quando o valor indicado é inteiro depois de tomar uma raiz quadrada?

Então, como você pode diferenciar entre 4 e 4.12323 em PHP sem usar um regex?

Foi útil?

Solução

De acordo com o manual do PHP, float sqrt ( float $arg ), sqrt () sempre retorna um float. Usando o is_int function () não vai resolver o problema porque ele verifica o tipo de dados e retorna uma falha.

Para contornar este problema, você pode testá-lo utilizando o módulo em vez disso: (deve ser fmod () para flutuar módulo de ponto e não o operador% para o módulo inteiro)

if (fmod(sqrt(16), 1) == 0) {
   // is an integer
}

Se você estiver usando PHP 5.2.0 ou mais tarde, eu acredito que isso também trabalho, mas eu não tê-lo usado neste tipo de circunstância de ter a certeza:

$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
    // is an integer
}

Outras dicas

Não, não é um número inteiro. É uma bóia .

Diz que mesmo no API, tipo de retorno é float.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Retorna a raiz quadrada de arg.

Você pode usar a função de andar para chegar a parte inteira do valor e subtrair o valor original. Se a diferença for! = 0, então não é um inteiro. por exemplo.

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

Porque ele sempre retorna um float:

float sqrt(float $arg)

Você pode lançá-lo em um número inteiro se quiser:

intval(sqrt(16));

Editar, Ok então:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Outra forma de verificar para inteiros seriam lançando a uma corda e verificar que, com ctype_digit()

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

É claro que esta é uma maneira um tanto estranha em relação ao uso modulo quando você está fazendo os cálculos de qualquer maneira. Mas é útil quando os valores de teste postado de um formulário, como eles serão cordas para começar. A ressalva é que ele iria retornar false para um inteiro negativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top