bcmath sometimes returns float, and sometimes round result

966 Views Asked by At

I have a variable $newTime, which is time in seconds made by mktime(), and I want to convert it into number of days.

In this case it is over 86.400 (which is a number of seconds in a day), and I try to divide it by 86.400 to get number of days (rounded).

But sometimes I get:

Case 1: 87951 / 86400 = 1.0179513888 (1 day ago)
Case 2: 156257 / 86400 = 1.8085300925 (2 days ago)

and sometimes:

Case 1: 87986 / 86400 = 1 (Should be 1 day ago)
Case 2: 156292 / 86400 = 1 (Should be 2 days ago)

This is the code:

$newTime = round(bcdiv($newTime, bcmul("24", bcmul("60", "60"))),0);

When I don't use bcmath, just the regular math ($newTime / (60*60*24)), I get floating results every time.

2

There are 2 best solutions below

1
Samuel Hapak On BEST ANSWER

Have you set the scale using bcscale? If it is set to 0, it could explain the behaviour. Please, try to call bcscale(100) before your computation;

4
Esailija On

You could use:

$newTime = round( $newTime / (60 * 60 * 24));

With no bcmath at all please.

Examples:

$newTime = 156292;
$newTime = round( $newTime / (60 * 60 * 24));
echo $newTime; //2 Always

$newTime = 87986;
$newTime = round( $newTime / (60 * 60 * 24));
echo $newTime; //1 Always