字符索引值相乘及parseInt返回小数的JavaScript技术问题咨询
解决你的两个问题:整数处理与索引相乘逻辑
嘿,我来帮你搞定这两个问题!
一、解决parseInt返回小数的问题
你现在用parseInt(decNum)/14来获取去掉最后一位的整数,这是逻辑错误哦——因为去掉最后一位数字本质是除以10取整,而不是除以14。14是你的校验数组长度,但和“去掉最后一位”的操作完全无关。
举个例子,你的decNum是"12312312312312",最后一位是2,去掉它应该得到1231231231231,正确的做法有两种:
- 字符串截取法(更直观):直接取前13位字符串再转成整数
var newNum = parseInt(decNum.slice(0, 13)); // 结果:1231231231231,完美符合预期
- 数学计算法:用
Math.floor对原数除以10取整(因为原数是14位,最后一位是个位,除以10后取整就去掉了个位)
var newNum = Math.floor(parseInt(decNum) / 10); // 结果同样是1231231231231
为什么之前除以14会得到小数?因为12312312312312 ÷ 14 = 1231231231231.2,这个计算和“去掉最后一位”完全不相关,换上面两种方法就没问题啦。
二、实现索引对应数值相乘的逻辑
你提到“整数无法使用charAt”,其实不用纠结把newNum转成整数后再处理——直接从原字符串的前13位取每个字符,转成数字后和validNum对应索引的元素相乘,再累加求和就好。这样代码更简单,也避免了大数可能带来的精度问题(虽然你的数字长度还没到JS整数精度上限,但字符串处理更稳妥)。
完整的修正代码如下:
var decNum = "12312312312312"; if(decNum.length === 14) { // 1. 获取去掉最后一位的数字(用字符串截取法) var newNumStr = decNum.slice(0, 13); var validNum = [1,7,4,2,8,7,3,2,1,2,3,4,1,3]; var sum = 0; // 2. 遍历前13位,和validNum对应索引的数值相乘累加 for (var i = 0; i < 13; i++) { // 把当前位置的字符串转成数字,和validNum[i]相乘后加到sum里 var currentDigit = parseInt(newNumStr.charAt(i)); sum += currentDigit * validNum[i]; } // 如果你需要用最后一位校验的话,可以继续写逻辑,比如: var lastDigit = parseInt(decNum.charAt(13)); console.log("累加和:", sum); console.log("最后一位:", lastDigit); }
如果一定要用整数newNum来处理,也可以把它转成字符串再用charAt,比如:
var newNumStr = newNum.toString(); for (var i = 0; i < newNumStr.length; i++) { var currentDigit = parseInt(newNumStr.charAt(i)); sum += currentDigit * validNum[i]; }
不过这种方法多了一步转字符串,不如直接用原字符串截取高效。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

