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