Skip to content
分类目录:

js精度计算

Post date:
Author:
Number of comments: no comments

js直接进行计算时,有时候会出现计算不准确的情况,例如

4.031 * 1000 = 4030.9999999999995

加减乘除方法:

function 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);
}

// 使用:add(0.1, 0.2, 0.3, 0.4) => 1。可以传多个参数进行相加。

function sub(...val) {
  let max = 0;
  let count = val[0] | 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);
}

// sub(1, 0.2, 0.3, 0.4) => 0.1。相当于1 - 0.2 -0.3 -0.4;可以传多个参数,使用首位减后面的所有参数。

function 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])
  );
}

// ride(0.5, 0.6) => 3, 只允许传入两个参数。%计算可以这样ride(0.5, 100) => 50。

function 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]))
  );
}

//  使用:exc(0.5, 0.2) => 2.5, 只允许传入两个参数。如果计算出现无穷数请后期根据需要修改最后代码进行取舍。

function percentage(val) {
  const strVal = val.toString();
  const index = strVal.indexOf(".");
  let num = 0;
  if (index > -1) {
    num = strVal.length - 1 - index;
  }
  if (num > 2) {
    return Math.round(val * Math.pow(10, num)) / Math.pow(10, num - 2);
  } else {
    return Math.round(val * 100);
  }
}

// 用于计算%数的。percentage(0.05) => 5

转载自: https://blog.csdn.net/github_38186390/article/details/84924741

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注