Frage

Gibt es eine Bibliotheksfunktion für diesen Zweck, so dass ich es nicht tun mit der Hand und Risiko in TDWTF enden?

echo ceil(31497230840470473074370324734723042.6);

// Expected result
31497230840470473074370324734723043

// Prints
<garbage>
War es hilfreich?

Lösung

Dies wird für Sie arbeiten:

$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);
}

Im Grunde findet es die flooy durch durch eine mit Null Genauigkeit multipliziert wird.

Dann kann es ceil / Runde tun, indem sie die von der gesamten Subtrahieren, in Funktionen der eingebauten Aufruf, dann das Ergebnis wieder auf

Edit: Fest für -ve Zahlen

Andere Tipps

UPDATE: Siehe meine bessere Antwort hier:

OK, für meine hochpräzise Geld Bibliothek , das ist zur Zeit auf Hunderte von Produktionsstätten, hatte ich völlig diese bcround Funktionalität neu zu schreiben. Nichts, was ich auf dem gesamten Internet gefunden war bis zum Code.

Hier ist, was ich kam mit:

/**
 * Based off of https://stackoverflow.com/a/1653826/430062
 * Thanks, [Alix Axel](https://stackoverflow.com/users/89771/alix-axel)!
 *
 * @param $number
 * @param int $precision
 * @return string
 */
function bcround($number, $precision = BCMathCalcStrategy::PRECISION)
{
    if (strpos($number, '.') !== false) {
        if ($number[0] != '-') return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision);
        return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision);
    }

    // Pad it out to the desired precision.
    return number_format($number, $precision);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top