为什么CoffeeScript使用%%代替模数而不是标准的javascript运算符%

时间:2014-04-17 06:52:09

标签: javascript coffeescript operators modulo

CoffeeScript documentation on operators中,它表示您可以使用%%作为真正的数学模数,但是没有解释为什么这与JavaScript中的“模运算符”%不同

更进一步说,CoffeeScript中的a %% b相当于在JavaScript中编写(a % b + b) % b,但对于大多数简单的情况,这似乎会产生相同的结果。

2 个答案:

答案 0 :(得分:28)

我确实在另一个StackOverflow问题中找到答案,并回答Javascript modulo not behavingI 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是一个数学技巧,能够为所有数字使用一个公式,而不是一个用于负数,第二个用于正数。不知道它不仅仅是一个技巧,而且具有一些内在意义。