如何执行整数除法并获得JavaScript中的余数?
在JavaScript中,我如何得到:
- 一个给定的整数进入另一个整体的次数?
- 其余的?
对于某个数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)