如何执行整数除法并获得JavaScript中的余数?

在JavaScript中,我如何得到:

  1. 一个给定的整数进入另一个整体的次数?
  2. 其余的?

对于某个数y和某个除数x计算商( quotient )和余数( remainder )为:

 var quotient = Math.floor(y/x); var remainder = y % x; 

我不是按位运算符的专家,但是这是另一种获得整数的方法:

 var num = ~~(a / b); 

这也适用于负数,而Math.floor()将以错误的方向回合。

这似乎也是正确的:

 var num = (a / b) >> 0; 

我做了一些Firefox的速度testing。

 -100/3 // -33.33..., 0.3663 millisec Math.floor(-100/3) // -34, 0.5016 millisec ~~(-100/3) // -33, 0.3619 millisec (-100/3>>0) // -33, 0.3632 millisec (-100/3|0) // -33, 0.3856 millisec (-100-(-100%3))/3 // -33, 0.3591 millisec /* a=-100, b=3 */ a/b // -33.33..., 0.4863 millisec Math.floor(a/b) // -34, 0.6019 millisec ~~(a/b) // -33, 0.5148 millisec (a/b>>0) // -33, 0.5048 millisec (a/b|0) // -33, 0.5078 millisec (a-(a%b))/b // -33, 0.6649 millisec 

以上是基于每个1000万的审判。

结论:使用(a/b>>0) (或(~~(a/b))(a/b|0) )可以获得约20%的效率增益。 另请注意,当a/b<0 && a%b!=0时,它们都与Math.floor不一致。

ES6引入了新的Math.trunc方法。 这可以解决@ MarkElliot的答案 ,使其工作负数:

 var div = Math.trunc(y/x); var rem = y % x; 

请注意, Math方法优于按位运算符,它们使用2 31以上的数字。

 var remainder = x % y; return (x - remainder) / y; 

你可以使用函数parseInt来得到一个截断的结果。

 parseInt(a/b) 

要获得余数,请使用mod运算符:

 a%b 

parseInt有一些string的缺陷,以避免使用基数为10的基数参数

 parseInt("09", 10) 

在某些情况下,数字的string表示可能是一个科学记数法,在这种情况下,parseInt会产生错误的结果。

 parseInt(100000000000000000000000000000000, 10) // 1e+32 

这个调用将产生1结果。

JavaScript计算负数的底部和非整数的其余部分,遵循它们的math定义。

FLOOR被定义为“小于参数的最大整数”,因此:

  • 正数:FLOOR(X)= X的整数部分;
  • 负数:FLOOR(X)= X减1的整数部分(因为它必须比参数小,即更负!)

REMAINDER被定义为除法(欧几里德算术)的“剩余”。 当股利不是一个整数时,商通常也不是一个整数,也就是说,没有余数,但是如果商被强制为一个整数(这就是当有人试图获得一个整数的余数或模数时浮点数),显然会有一个非整数“遗留”。

JavaScript确实按照预期计算了一切,所以程序员必须小心地提出正确的问题(人们应该小心地回答所问的问题!)Yarin的第一个问题不是“X是Y的整数除法是什么”,但是,相反,“一个给定的整数进入另一个整数”。 对于正数,两者的答案是相同的,但对于负数不是这样,因为整数除法(除数除数)将小于一个数(除数)“进入”另一个(除数)的次数。 换句话说,FLOOR会返回一个负数的整数除法的正确答案,但是Yarin没有这么问!

gammax正确回答,该代码正如Yarin所要求的。 另一方面,塞缪尔是错误的,他没有做math,我想,或者他会看到它是有用的(他也没有说他的例子中的除数是多less,但我希望它是3):

余量= X%Y = -100%3 = -1

GoesInto =(X – 余数)/ Y =( – 100 – -1)/ 3 = – 99/3 = -33

顺便说一下,我testing了Firefox 27.0.1上的代码,它按预期工作,正数和负数以及非整数值都用于分红和除数。 例:

-100.34 / 3.57:GoesInto = -28,剩余= -0.3800000000000079

是的,我注意到,那里有一个精确的问题,但我没有时间去检查它(我不知道是否是Firefox,Windows 7或我的CPU的FPU的问题)。 对于Yarin的问题,虽然只涉及到整数,但gammax的代码完美无缺。

Math.floor(operation)返回Math.floor(operation)的四舍五入值。

第一个问题的例子:

 var x = 5; var y = 10.4; var z = Math.floor(x + y); console.log(z); 

安慰:

15

第二个问题的例子:

 var x = 14; var y = 5; var z = Math.floor(x%y); console.log(x); 

安慰:

4

您可以使用三元来决定如何处理正整数值和负整数值。

 var myInt = (y > 0) ? Math.floor(y/x) : Math.floor(y/x) + 1 

如果数字是肯定的,一切都很好。 如果数字是负数,则会由于Math.floor处理负数而加1。

我通常使用(a - a % b) / b 。 这可能不是最优雅的,但它的作品。

这将总是截断为零。 不知道是否为时已晚,但这里是:

 function intdiv(dividend, divisor) { divisor = divisor - divisor % 1; if (divisor == 0) throw new Error("division by zero"); dividend = dividend - dividend % 1; var rem = dividend % divisor; return { remainder: rem, quotient: (dividend - rem) / divisor }; } 

亚历克斯·摩尔 – 涅米 ( Alex Moore-Niemi )的回答是:

对于来自Googlesearchdivmod ,你可以这样实现它:

 function divmod(x, y) { var div = Math.trunc(x/y); var rem = x % y; return [div, rem]; } 

结果:

 // [2, 33] 

如果你只是用两个幂来划分,你可以使用按位运算符:

 export function divideBy2(num) { return [num >> 1, num & 1]; } export function divideBy4(num) { return [num >> 2, num & 3]; } export function divideBy8(num) { return [num >> 3, num & 7]; } 

(第一个是商,第二个是余数)

计算页数可以在一个步骤中完成:Math.ceil(x / y)