js加减乘除精确运算方法(逻辑运算)

533 阅读1分钟

由于计算机数字是浮点型,所以在计算过程中通常得到的并不是一个准确的数据,所以在做一些运算的时候比较头疼,以下是加减乘除取余的精确运算的方法

乘法运算

/**
 * 乘法
 * @param {*} arg1
 * @param {*} arg2
 * @returns
 */
export function multiply(arg1, arg2) {
  let m = 0
  try {
    const arg1Fractional = String(arg1).split('.')[1]
    const arg2Fractional = String(arg2).split('.')[1]
    m += (arg1Fractional && arg1Fractional.length) || 0
    m += (arg2Fractional && arg2Fractional.length) || 0
  } catch (e) {
    return NaN
  }
  return (
    (Number(String(arg1).replace('.', '')) *
      Number(String(arg2).replace('.', ''))) /
    Math.pow(10, m)
  )
}

除法运算

/**
 * 除法
 * @param arg1
 * @param arg2
 * @returns
 */
export function division(arg1, arg2) {
  try {
    const arg1Fractional = String(arg1).split('.')[1]
    const arg2Fractional = String(arg2).split('.')[1]
    const arg1Length = (arg1Fractional && arg1Fractional.length) || 0
    const arg2Length = (arg2Fractional && arg2Fractional.length) || 0
    const differenceMultiple = Math.pow(10, arg2Length - arg1Length)
    return multiply(
      Number(String(arg1).replace('.', '')) /
      Number(String(arg2).replace('.', '')),
      differenceMultiple
    )
  } catch (e) {
    return NaN
  }
}

加法运算

/**
 * 加法
 * @param {*} arg1
 * @param {*} arg2
 * @returns
 */
export function addition(arg1, arg2) {
  try {
    const arg1Fractional = String(arg1).split('.')[1]
    const arg2Fractional = String(arg2).split('.')[1]
    const arg1Length = (arg1Fractional && arg1Fractional.length) || 0
    const arg2Length = (arg2Fractional && arg2Fractional.length) || 0
    const expandedMultiplier = Math.pow(10, Math.max(arg1Length, arg2Length))
    return (
      (multiply(arg1, expandedMultiplier) +
        multiply(arg2, expandedMultiplier)) /
      expandedMultiplier
    )
  } catch (e) {
    return NaN
  }
}

减法运算

/**
 * 减法
 * @param arg1
 * @param arg2
 * @returns
 */
export function subtraction(arg1, arg2) {
  try {
    const arg1Fractional = String(arg1).split('.')[1]
    const arg2Fractional = String(arg2).split('.')[1]
    const arg1Length = (arg1Fractional && arg1Fractional.length) || 0
    const arg2Length = (arg2Fractional && arg2Fractional.length) || 0
    const expandedMultiplier = Math.pow(10, Math.max(arg1Length, arg2Length))
    return (
      (multiply(arg1, expandedMultiplier) -
        multiply(arg2, expandedMultiplier)) /
      expandedMultiplier
    )
  } catch (e) {
    return NaN
  }
}

取余运算

/**
 * 取余数
 * @param arg1
 * @param arg2
 * @returns
 */
export function remainder(arg1, arg2) {
  try {
    const arg1Fractional = String(arg1).split('.')[1]
    const arg2Fractional = String(arg2).split('.')[1]
    const arg1Length = (arg1Fractional && arg1Fractional.length) || 0
    const arg2Length = (arg2Fractional && arg2Fractional.length) || 0
    const expandedMultiplier = Math.pow(10, Math.max(arg1Length, arg2Length))

    return (
      (multiply(arg1, expandedMultiplier) %
        multiply(arg2, expandedMultiplier)) /
      expandedMultiplier
    )
  } catch (e) {
    return NaN
  }
}