Pregunta

¿Por qué es la salida del sqrt no es un entero de "16" en PHP?

Ejemplo

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 > 

Creo que el problema es en la presentación interna que PHP se esconde de manera similar a Python. ¿Cómo se puede entonces sabe cuando la cifra dada es entero después de tomar una raíz cuadrada?

Entonces, ¿cómo se puede diferenciar entre 4 y 4.12323 en PHP sin necesidad de utilizar una expresión regular?

¿Fue útil?

Solución

De acuerdo con el manual de PHP, float sqrt ( float $arg ), sqrt () siempre devuelve un flotador. Uso de la función is_int () no resolverá el problema porque comprueba el tipo de datos y devuelve un error.

Para evitar esto, puede comprobarlo utilizando el módulo en su lugar: (debe ser HOQF () para el módulo de punto y no el operador% para el módulo entero flotante)

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

Si está usando PHP 5.2.0 o posterior, creo que esto también podría funcionar, pero no lo han utilizado en este tipo de circunstancias para estar seguro:

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

Otros consejos

No, no es un entero. Es un flotador .

Lo dice justo en el API, tipo de retorno es float.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Devuelve la raíz cuadrada de arg.

Puede utilizar la función del suelo para obtener la parte entera del valor y restar el valor original. Si la diferencia es! = 0, entonces no es un entero. por ejemplo.

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

Debido a que siempre devuelve un float:

float sqrt(float $arg)

Puede echarlo en un número entero si quieres:

intval(sqrt(16));

EDITAR, Ok entonces:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Otra forma de comprobar los números enteros se proyectaba en una cadena y la comprobación de que la ctype_digit()

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

Por supuesto, esto es una forma un tanto extraña comparación con el uso de módulo cuando se están haciendo los cálculos de todos modos. Pero es muy útil cuando se prueban los valores publicados de una forma, ya que serán las cadenas, para empezar. Una salvedad es que volvería falsa para un entero negativo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top