Javascript模块化算术

时间:2014-09-08 14:35:59

标签: javascript modular-arithmetic

Javascript将以下代码段评估为-1。

-5 % 4

据我所知,余数定理表明a = bq + r,使得0≤r<1。湾 鉴于上面的定义,答案不应该是3?为什么JavaScript返回-1?

5 个答案:

答案 0 :(得分:7)

因为它是remainder operator,而不是模数。但是有一个proposal for a proper one

Ecma 5.1引用

  

余数r来自被除数n,除数d由被定义   数学关系r = n - (d×q)   其中q是一个整数,只有当n / d为负时才为负数   仅当n / d为正时

答案 1 :(得分:1)

原因是%不是模数,而是余数运算符。 See here

答案 2 :(得分:1)

大多数编程语言使用对称模数,这与负数值的数学模型不同。

可以使用对称模来计算数学模数,如下所示:

a mod b = ((a % b) + b) % b

mod数学模数

%对称模

答案 3 :(得分:0)

如果你使用function ticketTable(ticks) { // tickets is an array this.tickets = ticks; // the callback array of methods to be run when // event is triggered this._callbacks = {handleCellClick:[this._handleCellClick]}; // assigned eventListenerInterface to one of this // objects properties this.handleCellClick = new eventListenerInterface(this,'handleCellClick'); } //set when eventListenerInterface is instantiated function eventListenerInterface(parent, callback_type) { this.parent = parent; this.callback_type = callback_type; } //run when event is triggered eventListenerInterface.prototype.handleEvent(evt) { for ( var i = 0; i < this.parent._callbacks[this.callback_type].length; i++ ) { //run the callback method here, with this.parent as //this and evt as the first argument to the method this.parent._callbacks[this.callback_type][i].call(this.parent, evt); } } ticketTable.prototype.render = function(element) { /* your code*/ { /* your code*/ //the way the event is attached looks the same cell1.addEventListener("click", this.handleCellClick, false); /* your code*/ } /* your code*/ } //handleCellClick renamed to _handleCellClick //and added evt attribute ticketTable.prototype._handleCellClick = function(evt) { // this shouldn't work alert(this.innerHTML); // this however might work alert(evt.target.innerHTML); // this should work alert(this.tickets.length); } 进行模运算,那么(概念上,至少)%是否计算为-1或3无关紧要,因为这两个数是全等模4 :出于模运算的目的,它们是相同的。

答案 4 :(得分:-1)

  

...如果余数非零,则余数有两种可能的选择,一种是负数,另一种是正数,并且商也有两种可能的选择。通常,在数论中,总是选择正余数,但编程语言根据语言和a和n的符号选择。 (http://en.wikipedia.org/wiki/Modulo_operation

在python中的

,它取了除数的符号:

   -5 % 4 ==  3   # -5 = (-2) * 4 + 3

在javascript中,它采用了divident的符号:

   -5 % 4 ==  -1   # -5 = (-1) * 4 - 1