美文网首页
Vue中通用方法小数计算的精度问题的处理(加减乘除)

Vue中通用方法小数计算的精度问题的处理(加减乘除)

作者: 前端小码农呀 | 来源:发表于2023-07-05 09:06 被阅读0次

前端小数的精度问题

0.1 + 0.2 !== 0.3

前言:因为历史的遗留问题,前端对浮点型数据的处理一直不是很精确,因此需要通过一些方法进行处理
可以新建一个utils目录下新建.js的文件

  • 多个数据的累加操作,传递一个数组即可
// 小数相加精度计算 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
}
  • 小数相减的处理,传递两个参数即可
// 小数相减 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)
}
  • 小数相除保留小数点位数,传递三个参数
// 除数,被除数, 保留的小数点后的位数
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)
}
  • 小数除法,不保留小数点位数,传递两个数据
// 除数,被除数, 保留的小数点后的位数
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(保留小数位数)
  • 小数相乘,传递两个参数
// 小数相乘
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中通用方法小数计算的精度问题的处理(加减乘除)

      本文链接:https://www.haomeiwen.com/subject/zaarnltx.html