Javascript将以下代码段评估为-1。
-5 % 4
据我所知,余数定理表明a = bq + r,使得0≤r<1。湾 鉴于上面的定义,答案不应该是3?为什么JavaScript返回-1?
答案 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)
在python中的...如果余数非零,则余数有两种可能的选择,一种是负数,另一种是正数,并且商也有两种可能的选择。通常,在数论中,总是选择正余数,但编程语言根据语言和a和n的符号选择。 (http://en.wikipedia.org/wiki/Modulo_operation)
,它取了除数的符号:
-5 % 4 == 3 # -5 = (-2) * 4 + 3
在javascript中,它采用了divident的符号:
-5 % 4 == -1 # -5 = (-1) * 4 - 1