JavaScript 中的取模 - 大数
-
06-09-2019 - |
题
我尝试用JS的模函数进行计算,但没有得到正确的结果(应该是1)。这是一段硬编码的代码。
var checkSum = 210501700012345678131468;
alert(checkSum % 97);
Result: 66
这里有什么问题吗?
问候,本尼迪克特
解决方案
一个一堆改进本尼迪克特的版本:“峰+ =‘’+ cDivident;”是错误修正; parseInt函数(除数)使得能够既传递参数作为字符串;检查末空字符串使得它总是返回数值;加入VAR语句,所以它不使用全局变量;转换后的foreach对旧式那么它在与旧JavaScript的浏览器;固定在波峰== 0;错误(感谢@ Dan.StackOverflow)。
function modulo (divident, divisor) { var cDivident = ''; var cRest = ''; for (var i in divident ) { var cChar = divident[i]; var cOperator = cRest + '' + cDivident + '' + cChar; if ( cOperator < parseInt(divisor) ) { cDivident += '' + cChar; } else { cRest = cOperator % divisor; if ( cRest == 0 ) { cRest = ''; } cDivident = ''; } } cRest += '' + cDivident; if (cRest == '') { cRest = 0; } return cRest; }
其他提示
有关的IBAN计算形成正常的BankAccount数我结束了包含在字符串中数据类型的数量非常大。从这大量的I具有当由97分找到其余 - >大量%97
只要我的数据类型转换为整数,我得到产生负整数溢出,最后一个错误的休息值。当我看到一些代码冗长件(这也给了错误的结果),我无法抗拒分享我自己的。学分转到有正常数量非常多的查找模
modulo: function(divident, divisor) {
var partLength = 10;
while (divident.length > partLength) {
var part = divident.substring(0, partLength);
divident = (part % divisor) + divident.substring(partLength);
}
return divident % divisor;
}
N.B。 我用10个职位在这里,因为这是比JavaScript的最大整数的15(有的)位置处变小,它导致了许多比97更大,这是一个不错的轮数。前两个参数关系。
看起来像你的牺牲品这样的:的 JavaScript的最高整数值,一个号码可以去不失精度是多少?
只是重申什么其他线程:
它们都是64位浮点值,最大的精确积分值2 ^ 53。然而,从规范部分[8.5:编号类型]:
一些ECMAScript的运营商只处理在范围内的整数-2 ^ 31〜2 ^ 31-1,以下,或在范围0到2 ^ 32-1,包括端值。这些运算符接受数字类型的任何值,但第一每个这样的值转换成一个2 ^ 32的整数值。参见ToInt32和ToUint32运营商的说明在部分0和0,分别
但是,信用,其中信贷是由于。吉米得到了公认的答案那边做跑腿(当然,谷歌搜索)。
最后,我的解决办法:
function modulo (divident, divisor) {
cDivident = '';
cRest = '';
for each ( var cChar in divident ) {
cOperator = cRest + '' + cDivident + '' + cChar;
if ( cOperator < divisor ) {
cDivident += '' + cChar;
} else {
cRest = cOperator % divisor;
if ( cRest == 0 ) cRest = '';
cDivident = '';
}
}
return cRest;
}
对于那些只想在 ES6 中复制并粘贴工作(功能)解决方案来检查 IBAN 的人:
function isIBAN(s){
const rearranged = s.substring(4,s.length) + s.substring(0,4);
const numeric = Array.from(rearranged).map(c =>(isNaN(parseInt(c)) ? (c.charCodeAt(0)-55).toString() : c)).join('');
const remainder = Array.from(numeric).map(c => parseInt(c)).reduce((remainder, value) => (remainder * 10 + value) % 97,0);
return remainder === 1;}
你甚至可以把它写成一句台词。
对存储实际数字的整数数组执行模运算(divident
, ,作为字符串应用于函数):
function modulo(divident, divisor){
return Array.from(divident).map(c => parseInt(c)).reduce((remainder, value) => (remainder * 10 + value) % divisor,0);
};
这是有效的,因为模对加法、减法和乘法具有分配性:
- (a+b)%m = ((a%m)+(b%m))%m
- (a-b)%m = ((a%m)-(b%m))%m
- (Ab)%m = ((a%m)(b%m))%m
转换为 ES5 的 IBAN 函数如下所示:
function (s) {
var rearranged = s.substring(4, s.length) + s.substring(0, 4);
var numeric = Array.from(rearranged).map(function (c) { return (isNaN(parseInt(c)) ? (c.charCodeAt(0) - 55).toString() : c); }).join('');
var remainder = Array.from(numeric).map(function (c) { return parseInt(c); }).reduce(function (remainder, value) { return (remainder * 10 + value) % 97; }, 0);
return remainder === 1;
};
静音马特已发展成一个Javascript 库的大整数。它可以解决这个问题了。