You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将数值约束至循环范围,是否存在更优雅的实现函数?

问题描述

现有函数:

func f(x,y) => x % y

给定输入的现有输出如下:

  • f(0, 30) => 0
  • f(7.5, 30) => 7.5
  • f(15, 30) => 15
  • f(22.5, 30) => 22.5
  • f(30, 30) => 0

但期望得到的输出为:

  • f(0, 30) => 0
  • f(7.5, 30) => -7.5
  • f(15, 30) => 15
  • f(22.5, 30) => 7.5
  • f(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));
}

逻辑说明:

  1. 先计算普通取模结果r,以及y的一半half;
  2. 当r为0或等于half时,直接返回原结果(符合期望要求);
  3. 如果r大于half,返回r - half(即取r到中点的正向差值);
  4. 如果r小于half,返回-(half - r)(即取r到中点的负向差值)。

这种实现去掉了冗余的分支判断,逻辑更紧凑,同时完全满足需求的准确性。

内容的提问来源于stack exchange,提问作者gargantuan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:11:19