Frage

Warum ist die Ausgabe von sqrt nicht eine ganze Zahl für "16" in PHP?

Beispiel

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 > 

Ich glaube, dass das Problem in der internen Darstellung ist, die PHP ähnlich wie Python versteckt. Wie kann man dann wissen, wenn die gegebene Zahl ist integer nach einer Quadratwurzel?

Wie können Sie unterscheiden zwischen 4 und 4.12323 in PHP ohne eine regex?

War es hilfreich?

Lösung

Nach der PHP-Handbuch, float sqrt ( float $arg ), sqrt () immer einen Schwimmer zurückgibt. Mit Hilfe der is_int () Funktion wird das Problem nicht lösen, weil es den Datentyp überprüft und einen Fehler zurückgibt.

Um dies zu umgehen, können Sie es testen, indem Sie Modul anstelle: (muss für Floating-Point-Modul und nicht der Operator% für Integer-Modul fmod () sein)

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

Wenn Sie PHP 5.2.0 oder höher verwenden, ich glaube, dies würde auch, aber ich habe es nicht in dieser Art von Umständen verwendet werden sicher:

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

Andere Tipps

Nein, es ist nicht eine ganze Zahl. Es ist ein Schwimmer .

Sagt es direkt in der API, Rückgabetyp float ist.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Gibt die Quadratwurzel von arg.

Sie können den Boden Funktion den ganzzahligen Teil des Werts zu erhalten und den ursprünglichen Wert subtrahieren. Ist die Differenz! = 0, dann ist es nicht eine ganze Zahl. z.

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

Weil es gibt immer einen float:

float sqrt(float $arg)

Sie können es in eine ganze Zahl werfen, wenn Sie wollen:

intval(sqrt(16));

EDIT, Ok dann:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Eine weitere Möglichkeit für die ganzen Zahlen zu überprüfen, würde zu einem String wird Gießen und prüfen, ob mit ctype_digit()

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

Natürlich ist dies eine etwas seltsame Art und Weise im Vergleich zur Verwendung Modulo, wenn Sie Berechnungen ohnehin tun. Aber es ist praktisch, wenn Werte aus einem Formular geschrieben testen, wie sie Strings sein zu beginnen. Ein Nachteil ist, dass es für eine negative ganze Zahl falsch zurückkehren würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top