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