js中,对整数范围是有限制的,超过安全范围会发生精度丢失,无法正常计算,常见的解决方案就是转成字符串处理,代码如下:
// 俩个大数相加 var a = '9998995523412341234123412441123412342', b = '0002245332134123423142341423424'; function bigSum(a, b) { a = String(a).split(''); b = String(b).split(''); var sum = '', // a,b数组元素之和 temp = 0, // a,b数组当前位置的计算结果 length = a.length > b.length ? a.length : b.length; while (length + 1) { temp = ~~(temp / 10) + ~~a.pop() + ~~b.pop(); // ~~: 双非按位取反运算符,对于正数,向下取整;对于负数,向上取整;非数字取值为0 sum = (temp % 10) + sum; length--; } return sum.replace(/^0+/, ''); // 去掉字符串前面的0 } bigSum(a, b); // => '9998995525657673368246835583464835766'
思路:1.将俩个字符串数字转成数组,取数组长度大的为循环次数 length + 1,加1是为了计算最后一次进1的情况。
2. temp 的值为( 当前a、b数组中数字之和 + 上次 temp 值去十取整 ),这里的值相加是数值相加,上次 temp 值若大于10需进1,则取1,小于10则取0。
3. sum 的值为( 当前 temp 值取余 + 上次 sum 值 ),这里的值相加是字符串拼接,当前仅对 temp 取余,如果需要进1,放到下次循环中处理(即下次计算 temp 值中判断是否进1)。
脚踏实地行,海阔天空飞