面试题Review - 字符串相加包含小数点如何运算

111 阅读2分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

前端作为弱数据类型, 在精度计算方面一直比较鸡肋。

作为某些特殊场景精度计算加减还是有存在的必要。

经典案例就是

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/…