解决两个浮点型数字相加、相减精度丢失问题

两字数据相加精确处理

/**
 * @param {*}  数字1
 * @param {*}  数字2
 * @description 两字数据相加精确处理
 */
export const addNum = function () {
  let args = arguments// 获取所有的参数
  let d = 0// 定义小数位的初始长度,默认为整数,即小数位为0
  let sum = 0// 定义sum来接收所有数据的和
  // 循环所有的参数
  for (let key in args) { // 遍历所有的参数
    // 把数字转为字符串
    var str = '' + args[key]
    if (str.indexOf('.') !== -1) { // 判断数字是否为小数
      // 获取小数位的长度
      var temp = str.split('.')[1].length
      // 比较此数的小数位与原小数位的长度,取小数位较长的存储到d中
      d = d < temp ? temp : d
    }
  }
  // 计算需要乘的数值
  var m = Math.pow(10, d)
  // 遍历所有参数并相加
  for (var key in args) {
    sum += args[key] * m
  }
  // 返回结果
  return sum / m
}

两个浮点数相减

export const accSub = function (num1, num2) {
  var r1, r2, m, n
  try {
    r1 = num1.toString().split('.')[1].length
  } catch (e) {
    r1 = 0
  }
  try {
    r2 = num2.toString().split('.')[1].length
  } catch (e) {
    r2 = 0
  }
  m = Math.pow(10, Math.max(r1, r2))
  n = (r1 >= r2) ? r1 : r2
  return (Math.round(num1 * m - num2 * m) / m).toFixed(n)
}

保留小数位数

export const getFloat = function (num, n) {
  n = n ? parseInt(n) : 0
  if (n <= 0) {
    return Math.round(num)
  }
  num = Math.round(num * Math.pow(10, n)) / Math.pow(10, n) // 四舍五入

  return num
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值