如何通过条件判断或循环从两个整数中选出最接近目标整数的数值
实现选取最接近基准值的整数的方法
核心判断规则
判断两个数值和基准值的接近程度,只需要对比两个数与基准值的差的绝对值:绝对值越小,代表和基准值越接近。
仅2个候选值的场景(对应给出的minus、plus两个变量的示例)
这种场景不需要循环,直接用if分支就能实现,代码逻辑如下:
int pick = 3; int minus = 0; int plus = 7; // 分别计算两个候选值与基准值的差值绝对值 int diffToMinus = Math.abs(pick - minus); int diffToPlus = Math.abs(pick - plus); int nearest; // 差值更小的就是最接近的值 if (diffToMinus <= diffToPlus) { nearest = minus; } else { nearest = plus; }
跑上述代码的结果和预期完全匹配:diffToMinus计算值为3,diffToPlus计算值为4,最终nearest会被赋值为minus的值0。
边界说明:如果两个候选值和基准值的差值绝对值完全相等(比如基准值是3,候选是0和6),上述写法会优先选择minus变量;如果需要调换相等场景的优先级,把if判断里的比较符换成
<就可以。
候选值数量不固定/较多的场景
如果后续可能增加更多候选值,挨个写if分支会非常冗余,直接用循环遍历所有候选值的方式实现,可扩展性更强,不管是2个、10个还是上百个候选值都能适配:
int pick = 3; // 把所有待比较的候选值统一存入数组,后续增减候选直接改这里即可 int[] candidateList = {0, 7, -2, 12, 4}; // 初始化记录:先假设第一个候选值是最接近的 int nearest = candidateList[0]; int minDiff = Math.abs(pick - nearest); // 依次遍历剩余的候选值做对比 for (int i = 1; i < candidateList.length; i++) { int currentDiff = Math.abs(pick - candidateList[i]); // 如果当前遍历的候选值差值更小,就更新最接近值的记录 if (currentDiff < minDiff) { minDiff = currentDiff; nearest = candidateList[i]; } }
以上述代码为例,所有候选值和基准值3的差值分别为3、4、5、9、1,最终计算得到的最接近值是4,完全符合预期。
常见注意点
- 代码里的
Math.abs()是用来计算绝对值的通用方法,不管是正数、负数的差值都能正确计算,不需要额外写判断正负的逻辑 - 如果遇到int类型的极端值(比如
Integer.MIN_VALUE),取绝对值会存在溢出的问题,普通业务场景下使用常规整数范围时不会遇到这个坑 - 相等场景的优先级可以根据实际需求调整,比如差相等时优先选更大的数、优先选更小的数,只要调整if判断里的符号和分支赋值就能实现
内容的提问来源于stack exchange,提问作者user15412162
相关产品推荐
相关产品推荐

