我尝试用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 库的大整数。它可以解决这个问题了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top