Domanda

Perché l'uscita del sqrt non un numero intero per "16" in PHP?

Esempio

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 > 

Credo che il problema sia nella presentazione interna che PHP nasconde allo stesso modo come Python. Come si può quindi sapere quando il dato è rappresentato intero dopo l'assunzione di una radice quadrata?

Così come si può distinguere tra 4 e 4.12323 in PHP senza usare una regex?

È stato utile?

Soluzione

Secondo il manuale di PHP, float sqrt ( float $arg ), sqrt () restituisce sempre un galleggiante. Utilizzando la funzione is_int () non risolverà il problema perché controlla il tipo di dati e restituisce un errore.

Per aggirare il problema, è possibile verificare che utilizzando il modulo invece: (deve essere fmod () per virgola mobile modulo e non l'operatore% per intero modulo)

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

Se si sta utilizzando PHP 5.2.0 o successivo, credo che questo potrebbe anche funzionare, ma io non l'ho usato in questo tipo di circostanza per essere certi:

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

Altri suggerimenti

No, non è un numero intero. Si tratta di un galleggiante .

dice proprio nel API, tipo di ritorno è flottante.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Restituisce la radice quadrata di arg.

È possibile utilizzare la funzione di piano per ottenere la parte intera del valore e sottrarre il valore originale. Se la differenza è! = 0 quindi la sua non è un numero intero. per es.

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

Dato che restituisce sempre un float:

float sqrt(float $arg)

Si può lanciare in un intero se si desidera:

intval(sqrt(16));

Modifica, Ok allora:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Un altro modo per verificare la presenza di interi sarebbe colata a una stringa e controllando che con ctype_digit()

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

Naturalmente questo è un modo un po 'strano rispetto all'utilizzo di modulo quando si sta facendo i calcoli in ogni caso. Ma è a portata di mano quando si prova valori iscritti da un modulo, in quanto saranno le stringhe per cominciare. Un avvertimento è che sarebbe tornato false per un intero negativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top