Округлить очень большой или маленький поплавок по шкале

У меня следующая ситуация, у меня есть некоторое кол-во, оно может быть очень большим или очень маленьким, например:

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

0

Решение

Вы слишком усложняете простую задачу:

function cutAtPrecision($number, $precision) {
return intval($number * (1 / $precision)) / (1 / $precision);
}

echo cutAtPrecision(323.659, 0.01); // 323.65
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]