PHP while循环如何判定每满100个订购商品并实现2%扣减规则
规则核心逻辑拆解
这类“每满X件享Y折扣”的计算,本质是先算累计能凑多少个优惠档位,再按档位折算总金额,不需要写无边界的循环。
按你给出的规则:
- 触发规则:该类别商品每累计满100件,就对总商品金额扣除2%的费用
- 档位计算:不满100件的零头不计入优惠,比如订309件,仅凑得出3个满100的档位(3*100=300件),剩余9件不满足档位要求
- 金额折算:每个档位对应扣2%,3个档位合计扣6%,最终应付金额为原价的94%
原有代码的问题点
- 无边界死循环:
while($i)的判断逻辑只要$i是正整数就永远为真,加上$i每轮自增没有设置退出条件,会直接无限执行耗尽服务器资源 - 档位判断逻辑偏差:用
$gesA % 100 == 0做判断,只有件数刚好是100的整数倍才会触发计算,像309、250这类非整百的件数,哪怕满足满档位要求也永远触发不了优惠 - 优惠数值计算错误:
$gesN = $gesN / 0.2相当于把总金额打到2折,和“扣除2%费用(即保留98%金额)”的需求差了10倍以上 - 冗余无效代码:循环里的
$gesN++每轮给总金额加1元,和业务规则没有任何关联
可直接运行的实现方案
直接用整数除法算档位,不需要额外循环,执行效率最高:
// 基础参数 $gesA = 309; // 订购商品件数 $gesN = 1011.08; // 商品总原价 // 计算满足的满档位数量,取整数部分,不满100的零头自动截断 $fullTier = intval($gesA / 100); // 计算总折扣比例:每个档位扣2% $totalDiscount = $fullTier * 0.02; // 计算扣减后的最终金额 $finalAmount = $gesN * (1 - $totalDiscount); // 格式化输出(保留两位小数适配金额场景) echo "最终应付金额:".number_format($finalAmount, 2);
如果业务规则要求每满一个档位就在上一次折算的金额基础上再扣2%,可以用带明确终止条件的循环实现,不要写无边界while:
$gesA = 309; $gesN = 1011.08; $finalAmount = $gesN; // 循环次数等于满足的满档数,跑完自动终止 for ($i = 0; $i < intval($gesA / 100); $i++) { // 每满100件,在当前金额基础上扣2%(即乘0.98) $finalAmount *= 0.98; } echo number_format($finalAmount, 2);
内容的提问来源于stack exchange,提问作者Delphinium
相关产品推荐
相关产品推荐

