js运算,解决小数精度丢失问题

由于计算机是用二进制来存储和处理文字,不能精确表示浮点数,而javascirt中没有相应的封装类来处理浮点型运算,直接运算,会出现精度丢失的问题。

为了解决这个问题,需找出参数中最大精度,参数都变成整数去计算。具体实现方法,参考如下。

 


/**

* 计算,处理精确度丢失

* @param {Number} arg1 参数1

* @param {Number} arg2 参数2

* @param {String} operator 运算符

* @param {String} accuracy 保留小数精度

*/

```

export function calculationRender(arg1, arg2, operator, accuracy) {

  if (operator === '/' && arg2 === 0) return;

  if (typeof arg1 === 'number' && typeof arg2 === 'number') {

    const precision1 = arg1.toString().split('.')[1] ? arg1.toString().split('.')[1].length : 0;

    const precision2 = arg2.toString().split('.')[1] ? arg2.toString().split('.')[1].length : 0;

    let maxPrecision = Math.max(precision1, precision2);

    const precision = precision1 >= precision2 ? precision1 : precision2;

    maxPrecision = 10 ** maxPrecision;

    let result;

    switch (operator) {

      case '+':

        result = (arg1 * maxPrecision + arg2 * maxPrecision) / maxPrecision;

        break;

      case '-':

        result = ((arg1 * maxPrecision - arg2 * maxPrecision) / maxPrecision).toFixed(precision);

        break;

      case '*':

        result =

          (Number(arg1.toString().replace('.', '')) * Number(arg2.toString().replace('.', ''))) /

          10 ** (precision1 + precision2);

        break;

      case '/':

        result =

          (Number(arg1.toString().replace('.', '')) / Number(arg2.toString().replace('.', ''))) *

          10 ** (precision2 - precision1);

        break;

      default:

        break;

    }

    if (accuracy || accuracy === 0) {

      if (

        result &&

        result.toString().split('.')[1] &&

        result.toString().split('.')[1].length > accuracy

      )

        result = result.toFixed(accuracy);

    }

    return result;

  }

}

```

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值