Search code examples
phplargenumberbcmath

How to round/ceil/floor a bcmath number in PHP?


Is there any library function for this purpose, so I don't do it by hand and risk ending in TDWTF?

echo ceil(31497230840470473074370324734723042.6);

// Expected result
31497230840470473074370324734723043

// Prints
<garbage>

Solution

  • This will work for you:

    $x = '31497230840470473074370324734723042.9';
    
    bcscale(100);
    var_dump(bcFloor($x));
    var_dump(bcCeil($x));
    var_dump(bcRound($x));
    
    function bcFloor($x)
    {
        $result = bcmul($x, '1', 0);
        if ((bccomp($result, '0', 0) == -1) && bccomp($x, $result, 1))
            $result = bcsub($result, 1, 0);
    
        return $result;
    }
    
    function bcCeil($x)
    {
        $floor = bcFloor($x);
        return bcadd($floor, ceil(bcsub($x, $floor)), 0);
    }
    
    function bcRound($x)
    {
        $floor = bcFloor($x);
        return bcadd($floor, round(bcsub($x, $floor)), 0);
    }
    

    Basically it finds the flooy by multiplying by one with zero precision.

    Then it can do ceil / round by subtracting that from the total, calling the built in functions, then adding the result back on

    Edit: fixed for -ve numbers