在PHP中舍入到最接近的5或9

时间:2018-04-21 15:07:49

标签: php woocommerce hook-woocommerce rounding

我需要使用PHP函数将产品的定价舍入到最接近的5或9

例如,它必须始终向上舍入:

$243 would round up to $245

$247 would round up to $249

目前使用以下代码,但这只是舍入到最接近的5:

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

非常感谢任何建议<3

3 个答案:

答案 0 :(得分:4)

通过检查除以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

要求有点模糊,因此可能仍会进行调整以处理其他各种角落案件。

答案 1 :(得分:2)

这有点不对,但应该有效:

function round9($n) {
    $n = ceil($n);
    $r = substr($n,-1) > 5 ? 9 : 5;
    $n = substr($n,0,-1) . $r;
    return $n;
}
  • 首先向上舍入到最接近的整数
  • 获取最后一位数字
  • 如果大于5,则将最后一位数字替换为9,否则替换为5。

更新:我认为这是一个有趣的问题,现在我们已经得到了三个正确的答案,从不同的角度解决了这个问题,我认为我会做一些表现分析我自己的好奇心。迄今为止,neuro_sys的答案获胜!以下是完成1000万次迭代的结果:

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

测试是在运行Ubuntu 16.04 / PHP 7.0.14的8GB 4 Core Linode VPS上运行的

答案 2 :(得分:1)

您应该阅读的相关问题:

这是解决方案:

因为您的问题不是使用核心数学(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

这可能会缩短为几行代码.....但无论如何