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;

  }

}

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容