PHP中按数值区间实现特定值取整且规避零值的方案求助
实现PHP分段取整逻辑的思路与代码
我来帮你把这个分段取整的需求拆解清楚,其实核心就是先判断数值所在区间,再套用对应区间的取整规则,再加上边界情况的处理就搞定了。
第一步:明确各区间的取整规律
先把你的需求转化成可落地的数学规则:
- 数值 ≤ 0:直接返回
0.05(因为要求不能为0或负数,接近0时向上取整) - 0 < 数值 < 1:取最接近的
0.05或0.10→ 本质是将数值按0.05的步长取整,等价于round($number * 20) / 20 - 1 ≤ 数值 < 10:取最接近的
x.45或x.95→ 你已经有了正确的代码:(round($number * 2) / 2) - 0.05,原理是先按0.5步长取整,再减0.05得到末尾为45或95的数 - 10 ≤ 数值 ≤ 30:取最接近的
2.45、4.95、7.45...29.95→ 这些数都是2.5的倍数 - 0.05,所以规则是(round($number / 2.5) * 2.5) - 0.05 - 数值 > 30:取最接近的
29.95、34.95、39.95...→ 对应你给出的代码:(round($number / 5) * 5) - 0.05,也就是按5的倍数取整后减0.05
第二步:整合为PHP函数
把上面的逻辑写成一个可复用的函数,加上注释让逻辑更清晰:
function customRound(float $number): float { // 处理边界:数值不能为0或负数,接近0时向上取整为0.05 if ($number <= 0) { return 0.05; } // 区间1:小于1,取最接近的0.05或0.10 if ($number < 1) { return round($number * 20) / 20; } // 区间2:1到10之间,取最接近的x.45或x.95 if ($number >= 1 && $number < 10) { return (round($number * 2) / 2) - 0.05; } // 区间3:10到30之间,取最接近的2.45/4.95/.../29.95 if ($number >= 10 && $number <= 30) { return (round($number / 2.5) * 2.5) - 0.05; } // 区间4:大于30,取最接近的x4.95或x9.95 return (round($number / 5) * 5) - 0.05; }
第三步:测试验证几个典型案例
可以跑几个测试用例看看结果是否符合预期:
customRound(0.03)→ 返回0.05(符合接近0向上取整)customRound(0.07)→ 返回0.05,customRound(0.08)→ 返回0.10customRound(5.2)→ 返回4.95,customRound(5.5)→ 返回5.45customRound(12.3)→ 返回12.45,customRound(13.5)→ 返回14.95customRound(32)→ 返回29.95,customRound(33)→ 返回34.95
如果遇到数值刚好在两个选项中间(比如5.25,离4.95和5.45距离相等),PHP的round默认会采用四舍五入(ROUND_HALF_UP)规则,这时候会取较大的那个值。如果需要调整这种中间值的处理逻辑,可以给round函数传第三个参数,比如round($number * 2, 0, ROUND_HALF_DOWN)来取较小的选项。
内容的提问来源于stack exchange,提问作者Radical_Activity
相关产品推荐
相关产品推荐

