Question

Pourquoi la sortie de sqrt pas un entier pour "16" en PHP?

Exemple

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 > 

Je pense que le problème est dans la présentation interne PHP cache la même façon que Python. Comment pouvez-vous savoir alors quand le chiffre donné est entier après avoir pris une racine carrée?

Alors, comment pouvez-vous la différence entre 4 et 4.12323 en PHP sans utiliser regex?

Était-ce utile?

La solution

D'après le manuel PHP, float sqrt ( float $arg ), sqrt () retourne toujours un flotteur. Utilisation de la fonction is_int () ne résoudra pas le problème, car il vérifie le type de données et retourne un échec.

Pour contourner ce problème, vous pouvez le tester en utilisant le module à la place: (doit être fmod () pour le module à virgule flottante et non l'opérateur% pour le module entier)

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

Si vous utilisez PHP 5.2.0 ou plus tard, je crois que cela fonctionnerait aussi, mais je l'ai pas utilisé dans ce type de circonstance pour être certain:

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

Autres conseils

Non, ce n'est pas un entier. Il est flottante.

dit droit dans l'API, le type de retour est flottant.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Retourne la racine carrée de arg.

Vous pouvez utiliser la fonction de plancher pour obtenir la partie entière de la valeur et soustraire la valeur d'origine. Si la différence est! = 0 alors son pas un entier. par exemple.

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

Parce qu'il retourne toujours un flotteur:

float sqrt(float $arg)

Vous pouvez le jeter dans un entier si vous voulez:

intval(sqrt(16));

EDIT, Ok alors:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Une autre façon de vérifier les entiers serait coulée à une chaîne et en vérifiant que par ctype_digit()

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

Bien sûr, cela est une façon un peu bizarre par rapport à l'utilisation de modulo lorsque vous faites des calculs de toute façon. Mais il est à portée de main pour tester les valeurs affichées à partir d'un formulaire, car ils seront cordes pour commencer. Une mise en garde est qu'il retournerait faux pour un entier négatif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top