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