将数值约束至循环范围,是否存在更优雅的实现函数?
问题描述
现有函数:
func f(x,y) => x % y
给定输入的现有输出如下:
f(0, 30) => 0f(7.5, 30) => 7.5f(15, 30) => 15f(22.5, 30) => 22.5f(30, 30) => 0
但期望得到的输出为:
f(0, 30) => 0f(7.5, 30) => -7.5f(15, 30) => 15f(22.5, 30) => 7.5f(30, 30) => 0
换而言之,希望输出以y / 2为中心。目前已通过多个if语句实现需求:
f(x, y) => { var res = x % y; if (res === 0) return res; if (res === y / 2) return res; if (res > y / 2) return res - y / 2; if (res < y / 2) return res * -1; }
但这种实现过于繁琐,希望找到更优雅的解决方案。
优雅实现方案
可以通过简化逻辑判断,结合数学关系实现更简洁的代码,核心思路是基于取模结果与y/2的相对位置进行映射:
f(x, y) => { const r = x % y; const half = y / 2; // 0或中点值直接返回,其余根据相对位置映射 return r === 0 || r === half ? r : (r > half ? r - half : -(half - r)); }
逻辑说明:
- 先计算普通取模结果
r,以及y的一半half; - 当
r为0或等于half时,直接返回原结果(符合期望要求); - 如果
r大于half,返回r - half(即取r到中点的正向差值); - 如果
r小于half,返回-(half - r)(即取r到中点的负向差值)。
这种实现去掉了冗余的分支判断,逻辑更紧凑,同时完全满足需求的准确性。
内容的提问来源于stack exchange,提问作者gargantuan
相关产品推荐
相关产品推荐

