加减乘除

发布时间 2023-12-19 16:59:05作者: 请叫我王小胖
/**
 * @description: 加法运算
 * @param {*} arg1
 * @param {*} arg2
 * @param {*} number 展示小数点后位数
 * @return {*}
 */
export function operationAdd(arg1, arg2, number = 2) {
    let l1 = 0,
        l2 = 0,
        m,
        c
    try {
        l1 = arg1.toString().split('.')[1].length
    } catch (e) {}
    try {
        l2 = arg2.toString().split('.')[1].length
    } catch (e) {}
    c = Math.abs(l1 - l2)
    m = Math.pow(10, Math.max(l1, l2))
    if (c > 0) {
        let cm = Math.pow(10, c)
        if (l1 > l2) {
            arg1 = Number(arg1.toString().replace('.', ''))
            arg2 = Number(arg2.toString().replace('.', '')) * cm
        } else {
            arg1 = Number(arg1.toString().replace('.', '')) * cm
            arg2 = Number(arg2.toString().replace('.', ''))
        }
    } else {
        arg1 = Number(arg1.toString().replace('.', ''))
        arg2 = Number(arg2.toString().replace('.', ''))
    }
    const sum = (arg1 + arg2) / m
    let max = 0
    try {
        max = sum.toString().split('.')[1].length
    } catch (error) {}
    return toFixedFun(sum, number)
}

/**
 * @description: 减法运算
 * @param {*} arg1
 * @param {*} arg2
 * @param {*} number 展示小数点后位数
 * @return {*}
 */
export function operationSub(arg1, arg2, number = 2) {
    let l1 = 0,
        l2 = 0,
        m,
        n
    try {
        l1 = arg1.toString().split('.')[1].length
    } catch (e) {
        l1 = 0
    }
    try {
        l2 = arg2.toString().split('.')[1].length
    } catch (e) {
        l2 = 0
    }
    m = Math.pow(10, Math.max(l1, l2)) //last modify by deeka //动态控制精度长度
    n = l1 >= l2 ? l1 : l2
    const sum = (arg1 * m - arg2 * m) / m
    let max = 0
    try {
        max = sum.toString().split('.')[1].length
    } catch (error) {}
    return toFixedFun(sum, number)
    // return sum.toFixed(number);
    // return max > number ? sum.toFixed(number) : sum.toFixed(n);
}

/**
 * @description: 乘法运算
 * @param {*} arg1
 * @param {*} arg2
 * @param {*} number 展示小数点后位数
 * @return {*}
 */
export function operationMul(arg1, arg2, number = 2) {
    let m = 0,
        l1 = 0,
        l2 = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString()
    try {
        m += s1.split('.')[1].length
        l1 = arg1.toString().split('.')[1].length
    } catch (e) {
        l1 = 0
    }
    try {
        m += s2.split('.')[1].length
        l2 = arg2.toString().split('.')[1].length
    } catch (e) {
        l2 = 0
    }
    const sum = (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m)
    let max = 0
    try {
        max = sum.toString().split('.')[1].length
    } catch (error) {}
    return toFixedFun(sum, number)
}

/**
 * @description: 除法运算
 * @param {*} arg1
 * @param {*} arg2
 * @param {*} number 展示小数点后位数
 * @return {*}
 */
export function operationDiv(arg1, arg2, number = 2) {
    let l1 = 0,
        l2 = 0,
        r1,
        r2
    try {
        l1 = arg1.toString().split('.')[1].length
    } catch (e) {}
    try {
        l2 = arg2.toString().split('.')[1].length
    } catch (e) {}
    r1 = Number(arg1.toString().replace('.', ''))
    r2 = Number(arg2.toString().replace('.', ''))
    const sum = (r1 / r2) * Math.pow(10, l2 - l1)
    let max = 0
    try {
        max = sum.toString().split('.')[1].length
    } catch (error) {}
    return toFixedFun(sum, number)
}
/**
 *重写toFixed 解决四舍五入问题
 *
 * @export
 * @param {*} data
 * @param {*} len
 */
export function toFixedFun(data, len) {
    const number = Number(data)
    if (isNaN(number) || number >= Math.pow(10, 21)) {
        return number.toString()
    }
    if (typeof len === 'undefined' || len === 0) {
        return Math.round(number).toString()
    }
    let result = number.toString()
    const numberArr = result.split('.')

    if (numberArr.length < 2) {
        // 整数的情况
        return padNum(result)
    }
    const intNum = numberArr[0] // 整数部分
    const deciNum = numberArr[1] // 小数部分
    const lastNum = deciNum.substr(len, 1) // 最后一个数字

    if (deciNum.length === len) {
        // 需要截取的长度等于当前长度
        return result
    }
    if (deciNum.length < len) {
        // 需要截取的长度大于当前长度 1.3.toFixed(2)
        return padNum(result)
    }
    // 需要截取的长度小于当前长度,需要判断最后一位数字
    result = `${intNum}.${deciNum.substr(0, len)}`
    if (parseInt(lastNum, 10) >= 5) {
        // 最后一位数字大于5,要进位
        const times = Math.pow(10, len) // 需要放大的倍数
        let changedInt = Number(result.replace('.', '')) // 截取后转为整数
        changedInt++ // 整数进位
        changedInt /= times // 整数转为小数,注:有可能还是整数
        result = padNum(`${changedInt}`)
    }
    return result
    // 对数字末尾加0
    function padNum(num) {
        const dotPos = num.indexOf('.')
        if (dotPos === -1) {
            // 整数的情况
            num += '.'
            for (let i = 0; i < len; i++) {
                num += '0'
            }
            return num
        } else {
            // 小数的情况
            const need = len - (num.length - dotPos - 1)
            for (let j = 0; j < need; j++) {
                num += '0'
            }
            return num
        }
    }
}