【问题标题】:Javascript modulo operator behaves differently from other languagesJavascript 模运算符的行为与其他语言不同
【发布时间】:2017-04-03 04:28:09
【问题描述】:

根据 Wikipedia,n 上的 modulo operator(整数除法的余数)应产生介于 0n-1 之间的结果。

python确实是这样:

print(-1%5) # outputs 4

Ruby:

puts -1%5 # outputs 4

Haskell

main = putStrLn $ show $ mod (-1) 5

但是在Javascript:

console.log(-1%5);

结果是-1!!

这是为什么呢?这个设计决策背后是否有逻辑?

虽然-1 等效于45,但负值使其更难用作索引。

例如:

arr[x%5]

当数组长度大于5 时,在pythonRuby 中始终是有效表达式,但在Javascript 中,这是一个等待发生的异常。

【问题讨论】:

  • 你引用了维基百科,但它明确指出When either a or n is negative, the naive definition breaks down and programming languages differ in how these values are defined. 所以它不像你声称的那样违反它。
  • 显然是这样,问题是为什么?
  • 另外我看不出 arr[x%5] 在 JS 中是怎样的 an exception waiting to happen - 如果你传入一个负数,你会得到一个否定的结果,所以你会得到 undefined。如果该运算符确实像 python 或其他什么那样工作,那么它将为您提供数组中的 random 元素。所以你可能有一个错误,直到很久以后才发现它,因为它似乎可以工作。
  • 至于“为什么”是这样的——你上次链接的骗子确实有答案——% 被视为“给我剩下的”。这似乎是基本原理。
  • 最终结果是%n 函数在应用于其他语言时具有n 可能值(例如python,ruby,haskell)但在javascript 中它具有2n-1 可能的值

标签: javascript division modulo


【解决方案1】:

请注意,虽然在大多数语言中,“%”是余数运算符,但在某些(例如 Python、Perl)中,它是模运算符。对于相同符号的两个值,两者是等价的,但是当被除数和除数的符号不同时,它们给出不同的结果。要在 JavaScript 中获取模数,请使用 ((a % n ) + n ) % n 代替 % n

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder

【讨论】:

    【解决方案2】:

    如果您通过“模数”将欧几里得除法的余数理解为数学中常见的,则% operator 不是模运算符。它被称为余数运算符,其结果始终与被除数具有相同的符号。 (在 Haskell 中,rem function 会这样做)。

    这种行为在编程语言中很常见,尤其是在 C 和 Java 中,JavaScript 的算术约定就是从这些语言中获得灵感的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 2022-08-21
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多