将数字限制在循环范围内。有没有更优雅的功能?

问题描述 投票:0回答:1

使用此功能

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

或者换句话说,我希望输出是

centred
周围
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;
}

但感觉就像我在强力强迫一些可能有更优雅的解决方案的东西。我的数学很糟糕,我什至不知道要寻找什么。

这就是问题所在。这个功能有更优雅的解决方案吗?

math
1个回答
0
投票

看来函数所需的输出是:

enter image description here

如果是这样的话,一句单行话可能是

x => -(x % 30) + 30 * (int)(x / 15 % 2)

但可能想考虑更具可读性

x => {
    var modulo = x % 30;
    if(modulo < 15)
        return -modulo; 
    else
        return 30 - modulo;
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.