针对浮点数计算,精度问题

270 阅读1分钟

浮点数计算

function highPcalculate() {

  /*
   * 判断obj是否为一个整数
   */
  const isInt = (obj) => {
    return Math.floor(obj) === obj
  }

  const toInteger = (floatNum) => {
      let ret = {times: 1, num: 0}
      if (isInt(floatNum)) {
          ret.num = floatNum
          return ret
      }
      const strfi  = floatNum.toString()
      const dotPos = strfi.indexOf('.')
      const len    = strfi.substr(dotPos+1).length
      const times  = Math.pow(10, len)
      const intNum = Number(strfi.replace('.', ''))
      ret.times  = times
      ret.num = intNum
      return ret
  }


  const operation = (a, b, digits, op) => {
    const o1 = toInteger(a)
    const o2 = toInteger(b)
    const n1 = o1.num
    const n2 = o2.num
    const t1 = o1.times
    const t2 = o2.times
    const max = t1 > t2 ? t1 : t2
    let result = null
      switch (op) {
          case 'add':
              if (t1 === t2) { // 两个小数位数相同
                  result = n1 + n2
              } else if (t1 > t2) { // o1 小数位 大于 o2
                  result = n1 + n2 * (t1 / t2)
              } else { // o1 小数位 小于 o2
                  result = n1 * (t2 / t1) + n2
              }
              return result / max

          case 'subtract':
              if (t1 === t2) {
                  result = n1 - n2
              } else if (t1 > t2) {
                  result = n1 - n2 * (t1 / t2)
              } else {
                  result = n1 * (t2 / t1) - n2
              }
              return result / max

          case 'multiply':
              result = (n1 * n2) / (t1 * t2)
              return result

          case 'divide':
            if (t1 === t2) {
                result = n1 / n2
            } else if (t1 > t2) {
                result = n1 / (n2 * (t1 / t2))
            } else {
                result = (n1 * (t2 / t1)) / n2
            }
            return result
      }
  }

  // 加减乘除的四个接口
  function add(a, b, digits) {
      return operation(a, b, digits, 'add')
  }
  function subtract(a, b, digits) {
      return operation(a, b, digits, 'subtract')
  }
  function multiply(a, b, digits) {
      return operation(a, b, digits, 'multiply')
  }
  function divide(a, b, digits) {
      return operation(a, b, digits, 'divide')
  }

  // exports
  return {
      add: add,
      subtract: subtract,
      multiply: multiply,
      divide: divide
  }
};

项目中也可下载对应的npm包方式引用

npm i high-pcalculate

const { add, subtract, multiply, divide } = highPcalculate

add(0.1, 0.2)
// 0.30000000000000004
// 0.3(处理后值)

subtract(1.1, 0.2)
// 0.9000000000000001
// 0.9(处理后值)

multiply(1.1, 0.1)
// 0.11000000000000001
// 0.11(处理后值)

divide(1.1, 10)
// 0.11000000000000001
// 0.11(处理后值)