javaScript中toFixed四舍五入产生的精度丢失问题

387 阅读1分钟

问题描述

在日常开发过程中,我们免不了的遇到需要四舍五入保留几位小数的场景。通常我们会使用js中提供的toFixed的api去完成这一需要。但是在开发过程中我们会发现在chrome和火狐浏览器下,使用toFixed会产生精度丢失的情况:

image.png

产生原因

这是为什么呢,经过查询我们得知,在chrome和火狐浏览器中toFixed时使用的银行家四舍五入法,该方法的规则是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

解决方法

我们可以用Math.round来规避这个问题,具体方法如下

/**
 * @description 使用Math.round实现四舍五入
 * @param {*} num 需要四舍五入的数字
 * @param {*} n 需要保留的小数位
 */
function roundOff(num, n) {
  if (typeof num === 'number') {
    // 只对数字类型进行操作
    let multiple = Math.pow(10, n);
    return (Math.round(num * multiple) / multiple).toFixed(n);
  }
  return num;
}

image.png