У меня следующая ситуация, у меня есть некоторое кол-во, оно может быть очень большим или очень маленьким, например:
3698541.2569854 или 0.569875255456.
Кроме того, у меня есть некоторые масштабы
или мин шаг, как
0,0001 или 1000,00.
Моя задача — округлить количество до ближайшего числа вниз. Пример:
$qty = 323.659;
$step = 0.1;
// result must be 323.6
У меня есть собственное решение, оно работает хорошо, но у меня проблема с очень большими числами.
private function roundDownByStep($qty, $stepSize) {
$stepSize = sprintf('%.16f', $stepSize);
$stepSize = preg_replace('/|\\..+?\\K0+$/', "", $stepSize);
$precision = strlen(substr(strrchr($stepSize, "."), 1));
if ($precision == 1 && $stepSize >= 1) {
$precision = 0;
}
if ($precision == 0) {
$subArg = 1/$stepSize;
return floor(($qty * $subArg)) / $subArg;
} else {
$subArg = bcdiv('1', $stepSize, $precision);
$result = floor(bcmul($qty, $subArg, $precision));
$result = sprintf('%.16f', $result);
$result = preg_replace('/|\\..+?\\K0+$/', "", $result);
return bcdiv($result, $subArg, $precision);
}
}
Вы можете примерить это на
http://sandbox.onlinephpfunctions.com/code/333f58c1487e86e53dde64c26930b57e1f9e0fe8
Вы слишком усложняете простую задачу:
function cutAtPrecision($number, $precision) {
return intval($number * (1 / $precision)) / (1 / $precision);
}
echo cutAtPrecision(323.659, 0.01); // 323.65
Других решений пока нет …