阶梯计费算法(以php为例)

∫`不撒娇的折耳猫 2020-4-15 2159

场景

如某xx计费规则:
当用户使用318的时候,价格 = 100*330 + (300-100)*300 + 18*280 = 98040

使用量价格
(0,100]330
(100,300]300
(300,500]280
(500,1000]220
(1000,2000]150
(2000, ∞]80
算法
<?php
// 构建规则,这里可以使用两个数组
$rules = [
    330=>[0,100],
    300=>[100,300],
    280=>[300,500],
    220=>[500,1024],
    150=>[1024,3*1024],
    36=>[100*1024, PHP_INT_MAX],
];
    
// print_r($rules);
 
function calc($used, $rules){
    $sum = 0;
    foreach ($rules as $key => $value){
        // 大于计费段
        if($used < $value[0]) break;
        // 累加前期计费
        if($used >= $value[1]) {
            $sum += $key * ($value[1] - $value[0]);
        }
        // 在最后计费段内
        if($value[0] < $used && $used <= $value[1]){
            $sum += ($used - $value[0]) * $key;
        }
    }
    return round($sum, 2);
}
 
echo calc(318, $rules);


最新回复 (0)
发新帖