ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JS加减乘除精度丢失问题解决

2021-07-02 15:32:11  阅读:168  来源: 互联网

标签:val sum JS let 丢失 nurVal maxDecimalLength Math 加减乘除


一、前言

​ 工作中经常遇到用户输入后实时计算结果,比如输入单价和数量后自动计算总价,部分情况下会出现丢失精度的问题。解决方式为将小数放大为整数,计算完后再缩小。

二、解决

   /*
    * 加法
    * add(0.123 , 1.4567 , 10.56789)
    */
    function add(...val) {
      let sum = 0,
        maxDecimalLength = getMaxDecimalLength(...val)

      val.forEach((x, index) => {
        // 所有数值转为整数计算
        sum += Math.round(x * Math.pow(10, maxDecimalLength))
      })

      return sum / Math.pow(10, maxDecimalLength)
    }

    /*
    * 减法
    * subtract(0.123 , 1.4567 , 10.56789)
    */
    function subtract(...val) {
      let sum,
        maxDecimalLength = getMaxDecimalLength(...val)

      val.forEach((x, index) => {
        let nurVal = Math.round(x * Math.pow(10, maxDecimalLength));

        if (index === 0)
          sum = nurVal
        else
          sum -= nurVal
      })

      return sum / Math.pow(10, maxDecimalLength)
    }

    /*
    * 乘法
    * multiply(0.123 , 1.4567 , 10.56789)
    */
    function multiply(...val) {
      let sum,
        decimalLengthSum = 0

      val.forEach((x, index) => {
        // 获取当前小数位长度
        let decimalLength = getMaxDecimalLength(x)
        // 将当前数变为整数
        let nurVal = Math.round(x * Math.pow(10, decimalLength));

        decimalLengthSum += decimalLength

        if (index === 0)
          sum = nurVal
        else
          sum *= nurVal
      })

      return sum / Math.pow(10, decimalLengthSum)

    }

    /*
    * 除法
    * divide(0.123 , 1.4567 , 10.56789)
    */
    function divide(...val) {

      let sum = 0,
        decimalLengthSum = 0

      val.forEach((x, index) => {
        // 获取当前小数位长度
        let decimalLength = getMaxDecimalLength(x)
        // 将当前数变为整数
        let nurVal = Math.round(x * Math.pow(10, decimalLength));

        if (index === 0) {
          decimalLengthSum = decimalLength

          sum = nurVal
        } else {
          decimalLengthSum -= decimalLength
          sum /= nurVal
        }
      })

      return sum / Math.pow(10, decimalLengthSum)

    }

    /*
    * 获取小数位数
    */
    function getMaxDecimalLength(...val) {
      // 最大小数位长度
      let maxDecimalLength = 0

      val.forEach((x) => {

        const strVal = x.toString(),
          dotIndex = strVal.indexOf('.')
        if (dotIndex > -1) {
          // 获取当前值小数位长度
          let curDecimalLength = strVal.length - 1 - dotIndex

          if (curDecimalLength > maxDecimalLength) {
            maxDecimalLength = curDecimalLength
          }
        }
      })

      return maxDecimalLength

    }

标签:val,sum,JS,let,丢失,nurVal,maxDecimalLength,Math,加减乘除
来源: https://www.cnblogs.com/gaozejie/p/14963452.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有