美文网首页
精确加减乘除

精确加减乘除

作者: 云高风轻 | 来源:发表于2023-11-28 18:07 被阅读0次

    1. 前言

    1. 单个功能一篇发展也方便自己使用
    2. 加减乘除 是常见的功能,但是经常会遇到不精准的问题,
      典型的比如 0.2+ 0.1 === 0.3 问题

    2. 加法代码

      // 加法封装 add(0.1, 0.2, 0.3, 0.4) => 1。可以传多个参数进行相加
     const add = (...val)=> {
        let max = 0;
        let count = 0;
        for (let i = 0; i < val.length; i++) {
          const strVal = val[i].toString();
          const index = strVal.indexOf(".");
          let num = 0;
          if (index > -1) {
            num = strVal.length - 1 - index;
            max = num > max ? num : max;
          }
        }
        for (let i = 0; i < val.length; i++) {
          count += Math.round(val[i] * Math.pow(10, max));
        }
        return count / Math.pow(10, max);
      },
         
    

    3. 减法

      // 减法封装  sub(1, 0.2, 0.3, 0.4) => 0.1。相当于1 - 0.2 -0.3 -0.4;可以传多个参数,使用首位减后面的所有参数。
     const  sub = (...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);
      },
    
    1. getMaxDecimalLength 方法 获取小数位数在下面有写

    4. 乘法

      // 乘法ride(0.5, 0.6) => 3, 只允许传入两个参数。%计算可以这样ride(0.5, 100) => 50。
      ride(...val) {
        const strVal = val[0].toString();
        const strValTwo = val[1].toString();
        const index = strVal.indexOf(".");
        const indexTwo = strValTwo.indexOf(".");
        const num = [0, 0];
        if (index > -1) {
          num[0] = strVal.length - 1 - index;
        }
        if (indexTwo > -1) {
          num[1] = strValTwo.length - 1 - index;
        }
        return (
          Math.round(
            val[0] * Math.pow(10, num[0]) * (val[1] * Math.pow(10, num[1]))
          ) / Math.pow(10, num[0] + num[1])
        );
      }
    

    5. 除法

      // 除法exc(0.5, 0.2) => 2.5, 只允许传入两个参数。如果计算出现无穷数请后期根据需要修改最后代码进行取舍。
      exc(val, valTwo = 100) {
        const strVal = val.toString();
        const strValTwo = valTwo.toString();
        const index = strVal.indexOf(".");
        const indexTwo = strValTwo.indexOf(".");
        const num = [0, 0];
        if (index > -1) {
          num[0] = strVal.length - 1 - index;
        }
        if (indexTwo > -1) {
          num[1] = strValTwo.length - 1 - index;
        }
        return (
          Math.round(val * Math.pow(10, num[0])) /
          (Math.round(valTwo * Math.pow(10, num[1])) *
            Math.pow(10, num[0] - num[1]))
        );
      }
    

    6. 获取小数位数

     /*
       * 获取小数位数
       */
      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;
      },
    

    参考资料


    初心

    我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
    如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
    共勉

    相关文章

      网友评论

          本文标题:精确加减乘除

          本文链接:https://www.haomeiwen.com/subject/driywdtx.html