浮点数计算精度问题

2022-04-13  本文已影响0人  maomizone

产生的原因

计算机在进行运算时是将数值转为二进制后计算,我们可以通过num.toString(2)这个方法查看转为二进制的字符串,当数字是浮点数时,转换为二进制时可能是循环数,而计算机存储只保留64位,所以对于循环数来说必然要舍弃位数,出现精度的问题

  let a = 10
  console.log(a.toString(2)); // 1010
  a = 0.1 // 循环数
  console.log(a.toString(2)); // 0.0001100110011001100110011001100110011001100110011001101
  a = 0.5
  console.log(a.toString(2)) // 0.1

解决方案

  function add(num1, num2){
      return (num1 + num2).toFixed(2)
  }

  console.log(add(0.1, 0.2)); // 0.30000000000000004 -> 0.30
  function plus(num1, num2){
     // 先转换一下 '1'->1
      num1 = +num1
      num2 = +num2
      if(isNaN(num1) || isNaN(num2)){
          return NaN
      }

      let max = Math.max(getPow(num1), getPow(num2))

      return (num1*max + num2*max)/max

  }

  function getPow(num){
      // 解构赋值
      let [, char = ''] = (num + '').split('.')
      let len = char.length

      return Math.pow(10, len)
  }

  console.log(plus(0.1, 0.234)); // 0.334
上一篇 下一篇

猜你喜欢

热点阅读