本文已参与「 新人创作礼 」活动,一起开启掘金创作之路
前端作为弱数据类型, 在精度计算方面一直比较鸡肋。
作为某些特殊场景精度计算加减还是有存在的必要。
经典案例就是
console.log (0.1+0.2) //0.30000000000000004
console.log (12345678900000000000.654321 + 987654322.1123) //12345678900987654000
大家在平时的工作中都会有这种场景问题,特别是浮点型的数据。
但是在100以内的加减乘除JavaScript还是游刃有余的。
所以就有了对数字加减进行拆解的问题。
我们举例如果要对上面这个大的数据进行加法处理我们该如何做了。
1. 肯定是一个字符串,因为他已经超过精度的计算范围了。//12345678900000000000.654321 这个在浏览器已经有了丢失的问题了。
2. 小数整数,进行拆分2断。
3. 按照段位的长度进行0补位。定义一个标记超出+1
4. 整数部分递减相加 + ,小数部分递增+ , 相加后大于>9 , 取模10 , 标记为1 用来作为下一次相加
5. 最近进行拼+
"12345678900000000000.654321" + "987654322.1123"
floatPlus("12345678900000000000.654321" , "987654322.1123")
function floatPlus ( f1 , f2 ) {
let arr1 = f1.split(".");
let arr2 = f2.split(".");
//计算小数部分
let decimals1 = (arr1.length > 1 ? arr1[1]:0)
let decimals2 = (arr2.length > 1 ? arr2[1]:0)
let decimals1Arr = decimals1.split("")
let decimals2Arr = decimals2.split("")
decimals1Len = decimals1Arr.length
decimals2Len = decimals2Arr.length
//计算position
let decimalsLong = decimals1Len > decimals2Len ? decimals1Len : decimals2Len
// arr plus
let flag = 0 , newDecimalArr = []
for (let i = 0 , j = decimalsLong; i < j; j-- ) {
let sum = parseInt(decimals1Arr[j-1]||0) + parseInt(decimals2Arr[j-1]||0)
if (flag) {
sum +=1
}
if ( sum >= 10 ) flag = 1
else flag = 0
newDecimalArr[j-1] = sum%10
}
//计算整数部分
integerPart1 = (arr1.length > 1 ? arr1[0]:0)
integerPart2 = (arr2.length > 1 ? arr2[0]:0)
let integerPart1Arr = integerPart1.split("")
let integerPart2Arr = integerPart2.split("")
integerPart1Len = integerPart1Arr.length
integerPart2Len = integerPart2Arr.length
let integerPartLong = integerPart1Len > integerPart2Len ? integerPart1Len : integerPart2Len
//integer plus
let newIntegerArr = []
for (let i = 0 , j = integerPartLong; i < j; i++ ) {
let sum = parseInt(integerPart1Arr[integerPart1Len -i - 1]||0) + parseInt(integerPart2Arr[integerPart2Len - i -1]||0)
if (flag) {
sum +=1
}
if ( sum >= 10 ) flag = 1
else flag = 0
newIntegerArr[integerPartLong-i-1] = sum%10
}
if (flag) {
newIntegerArr.slice(0,0,1)
}
return newIntegerArr.join("") + "." + newDecimalArr.join("")
}
let str = floatPlus("12345678900000000000.654321" , "987654322.1123")
console.log(str); //12345678900987654322.766621
如果你有更好的办法计算,且效率更好,也欢迎指出!每天努力一点点,让自己成长更快。
大家也可以去demo查看验证:tool.lu/coderunner/…