前端技术栈 有关前端的博客

加减乘除-解决计算精度问题

2019-09-24
皇甫春风

javascript 加减乘除-解决计算精度问题

/**
 *  num 小数个数
 * @param {*} num
 */
export function fractionalPart (num) {
  return num.toString().split('.').length === 1
    ? 0
    : num.toString().split('.')[1].length
}
/**
 * add 加
 * @param {Number} a
 * @param {Number} b
 * @returns {Number} a+b
 */
export function addNum (a, b) {
  const c = fractionalPart(a)
  const d = fractionalPart(b)
  const e = Math.pow(10, Math.max(c, d))
  return (mulNum(a, e) + mulNum(b, e)) / e
}
/**
 * subtract 减
 * @param {Number} a
 * @param {Number} b
 * @returns {Number} a - b
 */
export function subNum (a, b) {
  const c = fractionalPart(a)
  const d = fractionalPart(b)
  const e = Math.pow(10, Math.max(c, d))
  return (mulNum(a, e) - mulNum(b, e)) / e
}
/**
 * multiply 乘
 * @param {Number} a
 * @param {Number} b
 * @returns {Number} a * b
 */
export function mulNum (a, b) {
  const c = fractionalPart(a) + fractionalPart(b)
  return (
    (Number(a.toString().replace('.', '')) *
      Number(b.toString().replace('.', ''))) /
    Math.pow(10, c)
  )
}
/**
 * divide 除
 * @param {Number} a
 * @param {Number} b
 * @returns {Number} a / b
 */
export function divNum (a, b) {
  const c = Number(a.toString().replace('.', ''))
  const d = Number(b.toString().replace('.', ''))
  return mulNum(c / d, Math.pow(10, fractionalPart(b) - fractionalPart(a)))
}

评论

目录