PHP将数值向上取整为预定义电缆CSA序列下一个值的问题排查
问题原因分析
- 现有代码的逻辑是计算数组元素与目标值的差的绝对值,取差值最小的元素作为结果,本质是找最近匹配值,而非你需要的「大于等于目标值的最小标准值(向上取整匹配标准序列)」
- 以$s=10.3为例:10与10.3的差值绝对值为0.3,16与10.3的差值绝对值为5.7,按照现有逻辑会优先取差值更小的10,不符合需求
- $s=14.9时刚好与16的差值更小,所以恰巧符合预期,不具备通用性
修复方案
你的标准CSA序列本身是从小到大排序好的,直接遍历数组找到第一个大于等于$s的元素即可,还可以提前终止遍历优化性能,修复后代码如下:
$s = 10.3; // 标准电缆CSA规格列表(已按从小到大排序) $csa = array(1,1.5,2.5,4,6,10,16,25,35,50,70,95,120,150,185,240,300,400); function nextSizeUp($s, $csa) { foreach ($csa as $size) { // 数组已升序排列,第一个大于等于$s的元素就是目标结果 if ($size >= $s) { return $size; } } // 兜底逻辑:如果$s超过最大标准值,返回最大标准值,也可根据需求调整为异常提示 return end($csa); } echo nextSizeUp($s,$csa); // 输出16,符合预期
内容的提问来源于stack exchange,提问作者TomC
相关产品推荐
相关产品推荐

