Ben*_*ikt 17 javascript integer modulo
我尝试用JS'模数函数计算,但没有得到正确的结果(应该是1).这是一段硬编码的代码.
var checkSum = 210501700012345678131468;
alert(checkSum % 97);
Result: 66
Run Code Online (Sandbox Code Playgroud)
问题出在这里?
此致,Benedikt
小智 13
对于IBAN计算形式,正常的bankaccount数字我最终得到一个包含在字符串数据类型中的非常大的数字.从这个大数字我必须找到其余的除以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;
}
Run Code Online (Sandbox Code Playgroud)
NB我在这里使用了10个位置,因为它小于JavaScript中最大整数的15个(和一些)位置,它导致一个大于97的数字,这是一个很好的整数.前两个论点很重要.
Gil*_*ead 10
Benedikt版本的一系列改进:"cRest + =''+ cDivident;" 是一个错误修复; parseInt(divisor)可以将两个参数作为字符串传递; 最后检查空字符串是否总是返回数值; 添加了var语句,因此它不使用全局变量; 将foreach转换为旧式,因此它适用于具有较旧Javascript的浏览器; 修正了cRest == 0; bug(感谢@ 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; }
看起来你已经成为这个问题的受害者:一个数字可以达到的JavaScript的最高整数值是多少而不会失去精度?
只是重申另一个帖子中的内容:
它们是64位浮点值,最大精确积分值是2 ^ 53.但是,从规范部分[8.5:数字类型]:
一些ECMAScript运算符仅处理-2 ^ 31到2 ^ 31-1(包括两者)或0到2 ^ 32-1(包括0和2 ^ 32-1)范围内的整数.这些运算符接受Number类型的任何值,但首先将每个此类值转换为2 ^ 32个整数值之一.请分别参见第0节和第0节中ToInt32和ToUint32运算符的说明
但信贷到期的信用.吉米在那里得到了接受的答案来做腿部工作(好吧,谷歌搜索).
小智 5
对于那些只想在 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;}
Run Code Online (Sandbox Code Playgroud)
你甚至可以把它写成一行。
对存储实际数字(divident
,作为字符串应用于函数)的整数数组执行模运算:
function modulo(divident, divisor){
return Array.from(divident).map(c => parseInt(c)).reduce((remainder, value) => (remainder * 10 + value) % divisor,0);
};
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为 Modulo 在加法、减法和乘法上是可分配的:
转译为 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;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20936 次 |
最近记录: |