zoukankan      html  css  js  c++  java
  • js加减乘除丢失精度问题解决方法

    问题:js运算中经常导致小数精度丢失,如 0.1 + 0.2 => 0.30000000000000004,通过以下方法可以解决该问题。

    /**
     * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
     *
     * @param num1加数1 | num2加数2
     */
    export function numAdd(num1, num2) {
      let baseNum, baseNum1, baseNum2
      try {
        baseNum1 = num1.toString().split('.')[1].length
      } catch (e) {
        baseNum1 = 0
      }
      try {
        baseNum2 = num2.toString().split('.')[1].length
      } catch (e) {
        baseNum2 = 0
      }
      baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
      return (num1 * baseNum + num2 * baseNum) / baseNum
    }
    /**
     * 减法运算,避免数据相减小数点后产生多位数和计算精度损失。
     *
     * @param num1被减数 | num2减数
     */
    export function numSubtr(num1, num2) {
      let baseNum, baseNum1, baseNum2
      try {
        baseNum1 = num1.toString().split('.')[1].length
      } catch (e) {
        baseNum1 = 0
      }
      try {
        baseNum2 = num2.toString().split('.')[1].length
      } catch (e) {
        baseNum2 = 0
      }
      baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
      // 动态控制精度长度
      const n = baseNum1 >= baseNum2 ? baseNum1 : baseNum2
      return Number(
        ((num1 * baseNum - num2 * baseNum) / baseNum)
        .toFixed(n)
      )
    }
    /**
     * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
     *
     * @param num1被乘数 | num2乘数
     */
    export function numMulti(num1, num2) {
      let baseNum = 0
      try {
        baseNum += num1.toString().split('.')[1].length
      } catch (e) {}
      try {
        baseNum += num2.toString().split('.')[1].length
      } catch (e) {}
      return (
        (Number(num1.toString().replace('.', '')) *
          Number(num2.toString().replace('.', ''))) /
        Math.pow(10, baseNum)
      )
    }
    /**
     * 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
     *
     * @param num1被除数 | num2除数
     */
    export function numDiv(num1, num2) {
      let baseNum1 = 0,
        baseNum2 = 0
      let baseNum3, baseNum4
      try {
        baseNum1 = num1.toString().split('.')[1].length
      } catch (e) {
        baseNum1 = 0
      }
      try {
        baseNum2 = num2.toString().split('.')[1].length
      } catch (e) {
        baseNum2 = 0
      }
      baseNum3 = Number(num1.toString().replace('.', ''))
      baseNum4 = Number(num2.toString().replace('.', ''))
      return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1)
    }
    

    参考1:js加减乘除丢失精度问题解决方法
    参考1:js加减乘除运算(避免精度丢失)

  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/unlockth/p/15156924.html
Copyright © 2011-2022 走看看