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