Question

Why is the output of sqrt not an integer for "16" in PHP?

Example

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 > 

I feel that the problem is in the internal presentation which PHP hides similarly as Python. How can you then know when the given figure is integer after taking a square root?

So how can you differentiate between 4 and 4.12323 in PHP without using a regex?

Was it helpful?

Solution

According to the PHP manual, float sqrt ( float $arg ), sqrt() always returns a float. Using the is_int() function won't solve the problem because it checks the datatype and returns a failure.

To get around this, you can test it by using modulus instead: (must be fmod() for floating point modulus and not the % operator for integer modulus)

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

If you are using PHP 5.2.0 or later, I believe this would also work, but I haven't used it in this type of circumstance to be certain:

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

OTHER TIPS

No, it's not an integer. It's a float.

Says it right in the API, return type is float.

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

Returns the square root of arg .

You can use the floor function to get the integer part of the value and subtract the original value. If the difference is != 0 then its NOT an integer. e.g.

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

Because it always returns a float:

float sqrt(float $arg)

You can cast it into a integer if you want:

intval(sqrt(16));

EDIT, Ok then:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

Another way to check for integers would be casting to a string and checking that with ctype_digit()

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

Of course this is a somewhat weird way compared to using modulo when you are doing calculations anyway. But it is handy when testing values posted from a form, as they will be strings to begin with. A caveat is that it would return false for a negative integer.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top