JS四则运算重新封装,解决精度丢失问题

math.js

/* eslint-disable one-var */
/* eslint-disable no-extend-native */
/*
 * @Author: Simon
 * @Date: 2021-07-14 16:32:43
 * @LastEditors: Simon
 * @LastEditTime: 2022-04-11 18:49:53
 * @Description: 四则运算重新封装,解决精度丢失问题
 */

// 加法
Number.prototype.add = function (arg) {
  let r1, r2, m
  try { r1 = this.toString().split('.')[1].length } catch (e) { r1 = 0 }
  try { r2 = arg.toString().split('.')[1].length } catch (e) { r2 = 0 }
  m = Math.pow(10, Math.max(r1, r2))
  return (this * m + arg * m) / m
}
// 减法
Number.prototype.sub = function (arg) {
  let r1, r2, m, n
  try { r1 = this.toString().split('.')[1].length } catch (e) { r1 = 0 }
  try { r2 = arg.toString().split('.')[1].length } catch (e) { r2 = 0 }
  m = Math.pow(10, Math.max(r1, r2))
  // 动态控制精度长度
  n = (r1 >= r2) ? r1 : r2
  return Number(((this * m - arg * m) / m).toFixed(n))
}
// 乘法
Number.prototype.mul = function (arg) {
  let m = 0, s1 = this.toString(), s2 = arg.toString()
  try { m += s1.split('.')[1].length } catch (e) { }
  try { m += s2.split('.')[1].length } catch (e) { }
  return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
// 除法
Number.prototype.div = function (arg) {
  let t1 = 0, t2 = 0, r1, r2
  try { t1 = this.toString().split('.')[1].length } catch (e) { }
  try { t2 = arg.toString().split('.')[1].length } catch (e) { }
  r1 = Number(this.toString().replace('.', ''))
  r2 = Number(arg.toString().replace('.', ''))
  return (r1 / r2) * Math.pow(10, t2 - t1)
}

// 三位分节法(千分位加逗号)
Number.prototype.toThousandsString = function () {
  let str = this.toString()
  let reg = ~str.indexOf('.') ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g
  return str.replace(reg, '$1,')
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值