woocommerce — округление до ближайших 5 или 9 в переполнении стека

Мне нужно округлить цены на продукты, чтобы ближайшие 5 или 9 с функцией PHP.

Например, он всегда должен округляться:

$243 would round up to $245

$247 would round up to $249

В настоящее время используется следующий код, но это только округляет до ближайшего 5:

function round_five($num) {
return round($num*2,-1)/2;
}

Любой совет будет принята с благодарностью <3

0

Решение

Это немного не математично, но должно работать:

function round9($n) {
$n = ceil($n);
$r = substr($n,-1) > 5 ? 9 : 5;
$n = substr($n,0,-1) . $r;
return $n;
}
  • первый раунд до ближайшего целого
  • получить последнюю цифру
  • замените последнюю цифру на 9, если она больше 5. в противном случае замените на 5.

ОБНОВИТЬ: Я подумал, что это интересная проблема, и теперь, когда у нас есть три правильных ответа, которые решают ее с самых разных точек зрения, я решил провести небольшой анализ производительности для моего собственного любопытства. Ответ neuro_sys выигрывает, безусловно! Вот результаты в секундах для выполнения 10 миллионов итераций:

time to build array: 1.7170281410217
round9: 10.753921985626
my_round: 1.6339750289917
rounder: 16.578145980835

Тест проводился на 8-гигабайтном 4-ядерном Linode VPS под управлением Ubuntu 16.04 / PHP 7.0.14

2

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

Проверяя, является ли остаток от деления на 10 меньше 5, мы округляем его до 5, в противном случае, если он больше 5, мы округляем его до 9. Если нет, остаток равен 5, и мы возвращаем само число.

function my_round($number) {
$inumber = ceil($number);

$mod_10 = $inumber % 10;
$mod_5 = $inumber % 5;

if ($mod_10 < 5) {
return $inumber + 5 - $mod_5;
}

if ($mod_10 > 5) {
return $inumber + 10 - $mod_10 - 1;
}

return $inumber;
}

echo my_round(243) . PHP_EOL;
echo my_round(247) . PHP_EOL;
echo my_round(5) . PHP_EOL;
echo my_round(9) . PHP_EOL;
echo my_round(10) . PHP_EOL;
echo my_round(0) . PHP_EOL;
echo my_round(5.1) . PHP_EOL;
echo my_round(8.9) . PHP_EOL;
echo my_round(9.1) . PHP_EOL;

Выходы:

245
249
5
9
15
5
9
9
15

Требования немного расплывчаты, так что они все еще могут быть изменены, чтобы обрабатывать различные другие угловые случаи.

4

Связанные вопросы, которые вы должны были прочитать:

Поскольку в вашей проблеме не используются основные математические алгоритмы (5 и 9 произвольные) или большие показатели (наибольшее количество — 5 цифр, 0,1,2,3,4), просто подсчитайте числа:

<?php
function rounder($n) {
$x=[5,9];
$zz = ceil($n);
$b = substr((string)$zz, -1);
while( !in_array($b,$x) ){

$zz++;
$b = substr((string)$zz, -1);
}

return $zz;
}

$array[] = 243;
$array[] = 247;
$array[] = 249;
$array[] = 240;
$array[] = 250;

foreach($array as $row){

print rounder($row)."<Br>";

}
unset($row);

========================

Выход:

245
249
249
245
255

Это, вероятно, можно сократить до нескольких строк кода ….. но что угодно

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