场景要求:给定两个大整数,用字符串表示,例如"485469847.1545","944561612.17",输出"1430031459.3245",写一个函数输出他们的和,不通过其他高精度加法函数
实现思路:首先判断边界问题,之后截取两个字符串小数部分的长度,以最长的长度为准,短的后边补0(此处为小数部分),再通过对比两个字符串的长度,以最长的长度为准,短的前边补0(此处为整数部分),然候通过模拟整数加法算出结果,最后将小数点插入小数部分最长的位置。
代码实现:
const add = (a, b) => {
// 判断边界
if(a.length && !b.length) return a
if(!a.length && b.length) return b
if(a === '0' && b === '0') return '0'
let aArr = a.split('.')
let bArr = b.split('.')
// 求出小数部分的长度
let alen = a.split('.').length === 2? a.split('.')[1].length: 0
let blen = b.split('.').length === 2? b.split('.')[1].length: 0
// 取小数部分最长的长度
let len = alen > blen ? alen : blen
// 将分割后的字符串拼接
a = aArr[0] + ( aArr[1]? aArr[1] : '' )
b = bArr[0] + ( bArr[1]? bArr[1] : '' )
// 小数位数补0
for (let i = 0; i < len - alen; i++) {
a += '0'
}
for (let j = 0; j < len - blen; j++) {
b += '0'
}
// 整数位数补0
let maxLength = Math.max(a.length, b.length)
a = a.padStart(maxLength, 0)
b = b.padStart(maxLength, 0)
// 模拟整数加法
let t = 0, f = 0, sum = ''
for (let i = maxLength - 1; i >= 0; i--) {
t = parseInt(a[i]) + parseInt(b[i]) + f
f = Math.floor(t / 10)
sum = t % 10 + sum
}
// 处理首位加法 超过10进1
if (f == 1) sum = '1' + sum
// 拼接字符串返回结果
return sum = sum.substring(0, sum.length - len) + '.' + sum.substring(sum.length - len, sum.length)
}
补充说明: 这里的小数位数补0,是为了两个小数部分位数对齐,方便加法运算,整数部分同理。