在JavaScript 中,我如何获得:
- 给定整数进入另一个整数的次数?
- 其余的?
在JavaScript 中,我如何获得:
对于某些数字y
和某些除数,x
计算商 ( quotient
) 和余数 ( remainder
) 为:
var quotient = Math.floor(y/x); or parseInt(y/x);
var remainder = y % x;
我不是按位运算符的专家,但这是获得整数的另一种方法:
var num = ~~(a / b);
这也适用于负数,但Math.floor()
会朝错误的方向舍入。
这似乎也是正确的:
var num = (a / b) >> 0;
我在 Firefox 上做了一些速度测试。
-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% 的效率增益。还要记住,它们都与Math.floor
, when不一致a/b<0 && a%b!=0
。
ES6 引入了新Math.trunc
方法。这允许修复@MarkElliot 的答案,使其也适用于负数:
var div = Math.trunc(y/x);
var rem = y % x;
请注意,Math
与按位运算符相比,方法的优势在于它们可以处理超过 2 31 的数字。
我通常使用:
const quotient = (a - a % b) / b;
const remainder = a % b;
它可能不是最优雅的,但它有效。