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?
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.
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.