超出存储范围的大正整数相加
背景
- 计算机存储数字的能力有限,它不能存储很大的数字,到了一定的位数之后会丢失精度。JS里面可以通过Number.MAX_SAFE_INTEGER属性能拿到可存储的最大整数,超过这个值再进行运算会出现问题。
console.log(Number.MAX_SAFE_INTEGER);//9007199254740991
函数执行
/**
* 大整数相加(超出存储范围的大正整数)
* @param {String} a
* @param {String} b
* @returns String
*/
function sum(a, b) {
// 获取字符中最大长度
const len = Math.max(a.length,b.length);
// 补全字符长度
a = a.padStart(len, "0");
b = b.padStart(len, "0");
// 控制进位
let carry = 0;
let result = "";
for (let i = len - 1; i >= 0; i--) {
// 转数字运算
const sum = +a[i] + +b[i] + carry;
result = (sum % 10) + result;
carry = Math.floor(sum / 10);
}
// 判断进位是否存在,以免出现第一位为0
result = carry ? carry + result : result;
return result;
}
padStart:用另一个字符填充当前字符,从左侧开始填充 语法:str.padStart(targetLength,padString),参数分别是目标长度、填充字符。
资料补充
- String.prototype.padStart() developer.mozilla.org/zh-CN/docs/…