What's the best way to get the fractional part of a float in PHP?

Viewed 38284

How would you find the fractional part of a floating point number in PHP?

For example, if I have the value 1.25, I want to return 0.25.

10 Answers

Don't forget that you can't trust floating point arithmetic to be 100% accurate. If you're concerned about this, you'll want to look into the BCMath Arbitrary Precision Mathematics functions.

$x = 22.732423423423432;
$x = bcsub(abs($x),floor(abs($x)),20);

You could also hack on the string yourself

$x = 22.732423423423432;    
$x = strstr ( $x, '.' );

If if the number is negative, you'll have to do this:

 $x = abs($x) - floor(abs($x));

My PHP skills are lacking but you could minus the result of a floor from the original number

You can use fmod function:

$y = fmod($x, 1); //$x = 1.25 $y = 0.25

To stop the confusion on this page actually this is the best answer, which is fast and works for both positive and negative values of $x:

$frac=($x<0) ? $x-ceil($x) : $x-floor($x);

I ran speed tests of 10 million computations on PHP 7.2.15 and even though both solutions give the same results, fmod is slower than floor/ceil.

$frac=($x<0) ? $x-ceil($x) : $x-floor($x); -> 490-510 ms (depending on the sign of $x)

$frac=fmod($x, 1); -> 590 - 1000 ms (depending on the value of $x)

Whereas the actual empty loop itself takes 80 ms (which is included in above timings).

Test script:

$x=sqrt(2)-0.41421356237;

$time_start = microtime(true);
for ($i=0;$i<=9999999;$i++) {
    //$frac=fmod($x, 1); // version a
    $frac=($x<0) ? $x-ceil($x) : $x-floor($x); // version b
}
$time_end = microtime(true);

$time = $time_end - $time_start;
Related