js计算金额, 精度丢失, 四舍五入保留2位小数的方法

39 阅读1分钟

项目中关于js计算出现精度问题

思路: 用round取个四舍五入, 然后再保留规定的小数位

// 以前使用的这种
num = Math.floor(+num * 100) / 100
// 存在精度丢失问题, 导致算出来的不对, 改为toFixed

// 使用toFixed后, 发现它用的不是4舍5入, 而是银行家算法, 并且在某些浏览器中, 这个规则会不生效.

// 因此改写了toFixed方法

Number.prototype.toFixed = function (val = 0) {
  if (isNaN(val)) throw new Error('参数必须是数字或数字字符串!')
  let num = Math.round(this * 10 ** val) / 10 ** val
  if (val == 0) return num + ''
  let temp = Number.isInteger(num) ? num + '.000000000' : num + '000000000'
  return temp.slice(0, temp.indexOf('.') + val + 1)
}