在JavaScript中,我如何得到:
一个给定整数除另一个整数的整数倍是多少? 其余的呢?
在JavaScript中,我如何得到:
一个给定整数除另一个整数的整数倍是多少? 其余的呢?
当前回答
Alex Moore-Niemi的评论作为回答:
对于从谷歌搜索divmod的ruby,你可以这样实现它:
function divmod(x, y) {
var div = Math.trunc(x/y);
var rem = x % y;
return [div, rem];
}
结果:
// [2, 33]
其他回答
计算页数可以一步完成: Math.ceil (x / y)
Alex Moore-Niemi的评论作为回答:
对于从谷歌搜索divmod的ruby,你可以这样实现它:
function divmod(x, y) {
var div = Math.trunc(x/y);
var rem = x % y;
return [div, rem];
}
结果:
// [2, 33]
function integerDivison(dividend, divisor){
this.Division = dividend/divisor;
this.Quotient = Math.floor(dividend/divisor);
this.Remainder = dividend%divisor;
this.calculate = ()=>{
return {Value:this.Division,Quotient:this.Quotient,Remainder:this.Remainder};
}
}
var divide = new integerDivison(5,2);
console.log(divide.Quotient) //to get Quotient of two value
console.log(divide.division) //to get Floating division of two value
console.log(divide.Remainder) //to get Remainder of two value
console.log(divide.calculate()) //to get object containing all the values
如果你需要计算非常大的整数的余数,而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);
}
var remainder = x % y;
return (x - remainder) / y;