精确加减乘除

2023-11-28  本文已影响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;
  },

参考资料


初心

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

猜你喜欢

热点阅读