封装一个解决js运算精度缺失的函数

js精度缺失是js计算中必须考虑到的一个问题,也是一道经典的面试题

console.log(0.1+0.2);
//0.30000000000000004

出现这种问题倒是也正常,js中有且只有number类型,并没有其他编程语言JAVA或者C的int类型。
话不多说直接上封装好的函数

function operateArray(operation, numbers) {
  if (numbers.length === 0) {
    throw new Error('数组不能为空');
  }

  let result = numbers[0];

  for (let i = 1; i < numbers.length; i++) {
    switch (operation) {
      case 'add':
        result = add(result, numbers[i]);
        break;
      case 'subtract':
        result = subtract(result, numbers[i]);
        break;
      case 'multiply':
        result = multiply(result, numbers[i]);
        break;
      case 'divide':
        result = divide(result, numbers[i]);
        break;
      default:
        throw new Error('不支持的操作');
    }
  }

  return result;
}
//加
function add(a, b) {
  const precision = Math.max(getPrecision(a), getPrecision(b));
  const multiplier = Math.pow(10, precision);
  return (a * multiplier + b * multiplier) / multiplier;
}
//减
function subtract(a, b) {
  return add(a, -b);
}
//乘
function multiply(a, b) {
  const precision = getPrecision(a) + getPrecision(b);
  const multiplier = Math.pow(10, precision);
  return (a * multiplier * (b * multiplier)) / (multiplier * multiplier);
}
//除
function divide(a, b) {
  const precision = getPrecision(b) - getPrecision(a);
  const multiplier = Math.pow(10, precision);
  return (a * multiplier) / (b * multiplier);
}

function getPrecision(num) {
  const decimalPart = String(num).split('.')[1];
  return decimalPart ? decimalPart.length : 0;
}

如何使用?

import {operateArray} from "@/utils/index";

//传两个参,一个是计算方式,加减乘除,另一个要是计算的两个值
const value=operateArray('multiply',['值1','值2']);

这可以解决简单的计算部分只有一种计算符的使用场景

然而,我要是计算中有加减乘除咋整呢?

在精度需求不高的情况下,我们将最终的计算结果乘以100之后四舍五入后除以100也可以初步满足。如需再高精度,可以借助Decimal.js 或 BigNumber.js等第三方数字库来进行高精度计算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值