小数的精度——加减算法

1. 多个数据的累加操作,传递一个数组即可

// 小数相加精度计算 arr: [1.11, 2.333, 4.2333],需要多个值累计的操作,调用的时候传递进去一个数组。
// 原理:对数据进行遍历统一先乘以一个较大的整数进行累加,完成后对得到的数据进行除即可解决
export const decimal_NUM = (arr) => {
  let initial = 0
  arr.forEach(c => {
    c = Number(c) * 100000000
    initial = initial + Number(c)
  })
  return initial / 100000000
}

2. 小数相减的处理,传递两个参数即可

// 小数相减 5.9 - 3.1
export const Number_SubAll = (arg1, arg2) => {
  var re1, re2, m, n
  try {
    re1 = arg1.toString().split('.')[1].length
  } catch (e) {
    re1 = 0
  }
  try {
    re2 = arg2.toString().split('.')[1].length
  } catch (e) {
    re2 = 0
  }
  m = Math.pow(10, Math.max(re1, re2))
  n = (re1 >= re2) ? re1 : re2
  return ((arg1 * m - arg2 * m) / m).toFixed(n)
}

3. 小数相除保留小数点位数,传递三个参数

// 除数,被除数, 保留的小数点后的位数
export const Number_DIV = (arg1, arg2, digit) => {
  let t1 = 0
  let t2 = 0
  let r1 = null
  let r2 = null
  try { t1 = arg1.toString().split('.')[1].length } catch (e) { e }
  try { t2 = arg2.toString().split('.')[1].length } catch (e) { e }
  r1 = Number(arg1.toString().replace('.', ''))
  r2 = Number(arg2.toString().replace('.', ''))
  const result = ((r1 / r2) * Math.pow(10, t2 - t1)).toString()
  let result2 = result.split('.')[1]
  result2 = result2.substring(0, digit > result2.length ? result2.length : digit)
  return Number(result.split('.')[0] + '.' + result2)
}

4. 小数除法,不保留小数点位数,传递两个数据

// 除数,被除数, 保留的小数点后的位数
export const Number_Div = (data1, data2) => {
  let t1 = 0
  let t2 = 0
  let r1 = null
  let r2 = null
  // 获取每个参数的小数的位数
  try { t1 = data1.toString().split('.')[1].length } catch (e) { e }
  try { t2 = data2.toString().split('.')[1].length } catch (e) { e }
  // 把所有参数的小数点去掉转为整数
  r1 = Number(data1.toString().replace('.', ''))
  r2 = Number(data2.toString().replace('.', ''))
  return (r1 / r2) * Math.pow(10, t2 - t1)
}
// 如果想控制小数点的位数可以通过.toFixed(数位)进行处理
// let numbers = Number_Div(除数, 被除数).toFixed(保留小数位数)

5. 小数相乘,传递两个参数

// 小数相乘
export const Number_Mul = (arg1, arg2) => {
  var m = 0
  var s1 = arg1.toString()
  var s2 = arg2.toString()
  try {
    m += s1.split('.')[1].length
  } catch (e) { e }
  try {
    m += s2.split('.')[1].length
  } catch (e) { e }
  return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}

金额插件vue 使用 currency.js 处理 小数的相加减 精度问题_vue currency.js-CSDN博客