Поскольку версия ceil(pow(10, $precision) * $value) / pow(10, $precision);
в некоторых случаях дает сбой, например, round_up (2.22, 2) выдает неверный 2.23, как указано здесь , поэтому я адаптировал это string решение для round_down () к нашей проблеме round_up (). Это результат (отрицательная точность не учитывается):
function round_up($value, $precision) {
$value = (float)$value;
$precision = (int)$precision;
if ($precision < 0) {
$precision = 0;
}
$decPointPosition = strpos($value, '.');
if ($decPointPosition === false) {
return $value;
}
$floorValue = (float)substr($value, 0, $decPointPosition + $precision + 1);
$followingDecimals = (int)substr($value, $decPointPosition + $precision + 1);
if ($followingDecimals) {
$ceilValue = $floorValue + pow(10, -$precision); // does this give always right result?
}
else {
$ceilValue = $floorValue;
}
return $ceilValue;
}
Я не знаю, что это пуленепробиваемый, но, по крайней мере, он удаляет вышеупомянутый сбой. Я не делал никакого двоичного к десятичному математическому анализу, но если $floorValue + pow(10, 0 - $precision)
работает
всегда, как и ожидалось, тогда все должно быть в порядке. Если вы обнаружите какой-то случай с ошибкой, дайте мне знать - мы должны найти другое решение:)