字符串转整数时数值自动+1?JavaScript大数转换异常求助
问题原因:JavaScript数字精度限制
你遇到的问题是JavaScript的数字精度丢失导致的,核心原因是:
JavaScript使用IEEE 754双精度浮点数存储所有数字,这种格式能精确表示的整数范围是 -2^53 到 2^53(即 -9007199254740992 到 9007199254740992)。你的输入 9333852702227987 已经超出了这个范围,所以当你用*1或+将字符串转为数字时,JavaScript无法精确存储这个数,会自动将其舍入到最近的可表示浮点数,也就是9333852702227988,最终导致相加结果错误。
解决方法:字符串逐位相加
既然输入是超大数字字符串,就不能直接转成数字处理,必须通过字符串逐位模拟手工加法的逻辑来计算,具体实现如下:
/** * @param {string} num1 * @param {string} num2 * @return {string} */ var addStrings = function(num1, num2) { let i = num1.length - 1; let j = num2.length - 1; let carry = 0; const result = []; while (i >= 0 || j >= 0 || carry > 0) { // 取出当前位的数字,超出长度则取0 const digit1 = i >= 0 ? parseInt(num1[i]) : 0; const digit2 = j >= 0 ? parseInt(num2[j]) : 0; // 计算当前位总和 const sum = digit1 + digit2 + carry; // 当前位的结果是总和取余10 result.push(sum % 10); // 更新进位 carry = Math.floor(sum / 10); i--; j--; } // 结果数组是逆序的,反转后转成字符串 return result.reverse().join(''); }; console.log(addStrings("9333852702227987","85731737104263")); // 输出:9419584439332250
这个方法通过逐位遍历两个字符串,模拟手工加法时的进位逻辑,完全避免了数字精度丢失的问题,能正确处理任意长度的超大数字字符串相加。
内容的提问来源于stack exchange,提问作者Boban Banjevic
相关产品推荐
相关产品推荐

