在JavaScript中,我如何得到:
一个给定整数除另一个整数的整数倍是多少? 其余的呢?
在JavaScript中,我如何得到:
一个给定整数除另一个整数的整数倍是多少? 其余的呢?
当前回答
我通常使用:
const quotient = (a - a % b) / b;
const remainder = a % b;
它可能不是最优雅的,但它是有效的。
其他回答
Alex Moore-Niemi的评论作为回答:
对于从谷歌搜索divmod的ruby,你可以这样实现它:
function divmod(x, y) {
var div = Math.trunc(x/y);
var rem = x % y;
return [div, rem];
}
结果:
// [2, 33]
对于某个数y和某个除数x,计算商(商)[1]和余数(余)为:
const quotient = Math.floor(y/x);
const remainder = y % x;
例子:
const quotient = Math.floor(13/3); // => 4 => the times 3 fits into 13
const remainder = 13 % 3; // => 1
[1]由一个数除以另一个数得到的整数
floor(operation)返回操作的四舍五入值。
第一个问题的例子:
Const x = 5; Const y = 10.4; const z =数学。地板(x + y); console.log (z);
第二个问题的例子:
Const x = 14; Const y = 5; const z =数学。地板(x % y); console.log (x);
我不是位运算的专家,但这里有另一种方法来获得整个数字:
var num = ~~(a / b);
这也适用于负数,而Math.floor()将以错误的方向舍入。
这似乎也是正确的:
var num = (a / b) >> 0;
如果你需要计算非常大的整数的余数,而JS运行时不能这样表示(任何大于2^32的整数都表示为浮点数,所以它失去了精度),你需要做一些技巧。
这对于检查我们日常生活中许多情况下的支票数字(银行账号、信用卡等)尤为重要。
首先,你需要你的数字作为一个字符串(否则你已经失去了精度,余数没有意义)。
str = '123456789123456789123456789'
现在需要将字符串分割成更小的部分,足够小,以便任何余数和一段字符串的连接可以容纳9位数字。
digits = 9 - String(divisor).length
准备一个正则表达式来分割字符串
splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g')
例如,如果digits为7,则regexp为
/.{1,7}(?=(.{7})+$)/g
它匹配最大长度为7的非空子字符串,后面跟着((?=…)是正前向)若干个字符,该字符是7的倍数。“g”是让表达式遍历所有字符串,而不是在第一次匹配时停止。
现在将每个部分转换为整数,并通过reduce计算余数(将之前的余数加回去-或0 -乘以正确的10次方):
reducer = (rem, piece) => (rem * Math.pow(10, digits) + piece) % divisor
这是可行的,因为“减法”余数算法:
n mod d = (n - kd) mod d
它允许用余数替换十进制表示的任何“初始部分”,而不影响最后的余数。
最终代码看起来像这样:
function remainder(num, div) {
const digits = 9 - String(div).length;
const splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g');
const mult = Math.pow(10, digits);
const reducer = (rem, piece) => (rem * mult + piece) % div;
return str.match(splitter).map(Number).reduce(reducer, 0);
}