Math 简单数学-计算一个滚动的数字窗口(啊哈!负模/余数!!)

Math 简单数学-计算一个滚动的数字窗口(啊哈!负模/余数!!),math,Math,我几乎不好意思问这个问题,因为这可能是非常明显的,但我看不到一个办法,并怀疑有一个 我有一个变量,我需要从中加/减数值,但我想把它保持在一个数值范围内,在两端循环-例如 范围是0-3,所以值是0,1,2,3,0,1,2,3-这就是 x = (x + val) MOD 4 然而,当val为负值时,我们应该看到0,3,2,1,0,3,2,1,并且解远没有那么优雅 x = (x + val) MOD 4 if (x < 0) x = 4 + x; x=(x+val)模块4 如果(x=0,它们

我几乎不好意思问这个问题,因为这可能是非常明显的,但我看不到一个办法,并怀疑有一个

我有一个变量,我需要从中加/减数值,但我想把它保持在一个数值范围内,在两端循环-例如

范围是0-3,所以值是0,1,2,3,0,1,2,3-这就是

x = (x + val) MOD 4
然而,当val为负值时,我们应该看到0,3,2,1,0,3,2,1,并且解远没有那么优雅

x = (x + val) MOD 4
if (x < 0) x = 4 + x;
x=(x+val)模块4
如果(x<0)x=4+x;
这是可行的,但它很笨重,我忍不住想可能有一个“一条线”的解决方案——但如果我能想到它,我就该死了?:)

准备尴尬

正如TaZ所指出的,大多数“模”运算符实际上是余数运算符,对于
x+val>=0
,它们只起到“数学模”的作用

在C++中,如发现(有一些修改),你可以定义一个更像“SO”/P>的“数学上正确的”模
double mod(double x, double y) { return y!=0 ? x-floor(x/y)*y : x; }   
(也可以制作一个整数版本),这样

x = mod(x+val,4); 

适用于正片和负片
x+val

为什么它必须是一行长?正确的模运算符已经做到了这一点。如果您使用余数运算符(在编程语言中通常为
%
)实现此操作,那么行为将以负数更改,并且您需要发布的两行程序。换句话说:您可能使用了余数运算符而不是适当的模运算符。@raedwald如果它很优雅并且看起来和感觉像一个bodge:)可能重复:@TaZ-aha-现在我意识到这不是一个罕见的问题,语言如何处理模的变化很大(这个建议似乎是两种方法都不“正确”——你只需要解决它就行了……)?我特别需要使用Javascript——我在前面的评论中引用的问题是……((a+b)%a+b)%b非常优雅,但我正在记事本上涂鸦检查:)