JavaScript合并整数数组后用parseInt转换出现数值偏差的原因?
为什么parseInt转换长数字字符串会得到错误结果?
你的问题出在JavaScript的Number类型精度限制上:
- JavaScript里的常规数字(Number)是64位双精度浮点数,它只能精确表示范围在
-2^53到2^53(也就是-9007199254740992到9007199254740992)之间的整数。 - 你的数组拼接后得到的字符串是
6145390195186705543,这个数的大小已经超过了2^53,超出部分的二进制位无法被精确存储,所以当parseInt把它转换成Number类型时,会自动进行舍入,导致末尾的数字被修改,最终得到6145390195186705000。
验证一下:
const str = nums.join(''); console.log(str); // 输出 6145390195186705543 console.log(Number.MAX_SAFE_INTEGER); // 输出 9007199254740992,也就是2^53 console.log(str > Number.MAX_SAFE_INTEGER); // 输出 true,说明确实超出了安全范围
如果需要精确处理这种超大整数,应该用JavaScript的BigInt类型:
let nums = [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3] console.log(BigInt(nums.join(''))); // 输出 6145390195186705543n
BigInt可以表示任意精度的整数,不会出现精度丢失的问题。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

