在CoffeeScript documentation on operators中,它表示您可以使用%%
作为真正的数学模数,但是没有解释为什么这与JavaScript中的“模运算符”%
不同
更进一步说,CoffeeScript中的a %% b
相当于在JavaScript中编写(a % b + b) % b
,但对于大多数简单的情况,这似乎会产生相同的结果。
答案 0 :(得分:28)
我确实在另一个StackOverflow问题中找到答案,并回答Javascript modulo not behaving和I wanted to share it,因为那些喜欢我的人只是寻找“CoffeeScript”相关的解释,因此很难找到正确的答案。
使用编译为a %% b
的{{1}}的原因是,对于负数,如(a % b + b) % b
,JavaScript会产生负数-5 % 3
,而正确的数学答案应该是是-5 % 3 = -2
。
接受的答案是an article on the JavaScript modulo bug,它解释得很好。
答案 1 :(得分:2)
起初对我没有任何意义,所以我认为它需要一个例子
check = (a,b) ->
c = (b*Math.floor(a/b)) + a%b
d = (b*Math.floor(a/b)) + a%%b
console.log(
[c, c == a]
[d, d == a]
)
check 78, 33 # [ 78, true ] [ 78, true ]
check -78, 33 # [ -111, false ] [ -78, true ]
###
78 mod 33 = 12
-78 mod 33 = 21
check: 78 = 33 * 2 + 12
check: -78 = 33 * -3 + 21
###
看起来modulo是一个数学技巧,能够为所有数字使用一个公式,而不是一个用于负数,第二个用于正数。不知道它不仅仅是一个技巧,而且具有一些内在意义。