前端: XEUtils.add(a,b) 丢失精度问题

前端JS: XEUtils.add(a,b)计算 会丢精度

在这里插入图片描述

解决方案:

1.XEUtils.add计算后, 增加精度处理

  • XEUtils.round(Number,小数位数)
  • parseFloat(Number).toFixed(小数位数)

2. 可使用以下js进行±*/计算

/**
 * @description: 加法函数,用来得到精确的加法结果。
 * javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 * @param {*} num1
 * @param {*} num2
 * @return {*}
 */
export function $Add (num1, num2) {
    let maxLength, num1Length, num2Length
    // 如果参数无法被转换成数字类型则返回0
    if (isNaN(Number(num1)) || isNaN(Number(num2))) {
        return 0
    }
    try {
        num1Length = num1.toString().split('.')[1].length
    } catch (e) {
        num1Length = 0
    }
    try {
        num2Length = num2.toString().split('.')[1].length
    } catch (e) {
        num2Length = 0
    }
    maxLength = Math.pow(10, Math.max(num1Length, num2Length))
    //  将两位浮点数同时扩大n倍
    let num11 = num1.toString().split('.').join('') + (new Array(num1Length > num2Length ? 0 : num2Length - num1Length).fill('0').join(''))
    let num22 = num2.toString().split('.').join('') + (new Array(num2Length > num1Length ? 0 : num1Length - num2Length).fill('0').join(''))
    return (Number(num11) + Number(num22)) / maxLength
}
/**
 * @description: 减法函数,用来得到精确的减法结果
 * @param {*} num1
 * @param {*} num2
 * @return {*}
 */
export function $Sub (num1, num2) {
    // 如果参数无法被转换成数字类型则返回0
    if (isNaN(Number(num1)) || isNaN(Number(num2))) {
        return 0
    }
    return $Add(num1, -Number(num2))
}
/**
 * @description: 乘法函数
 * @param {*} num1 乘数1
 * @param {*} num2 乘数2
 * @param {*} precious  精度
 * @return {*}
 */
export function $Mul (num1, num2, precious = null) {
    let maxLength, num1Length, num2Length
    // 如果参数无法被转换成数字类型则返回0
    if (isNaN(Number(num1)) || isNaN(Number(num2))) {
        return 0
    }
    try {
        num1Length = num1.toString().split('.')[1].length
    } catch (e) {
        num1Length = 0
    }
    try {
        num2Length = num2.toString().split('.')[1].length
    } catch (e) {
        num2Length = 0
    }
    maxLength = num1Length + num2Length
    if (precious !== null && precious !== undefined && (!isNaN(parseInt(precious)))) {
        return Number(Number(num1.toString().replace('.', '')) * Number(num2.toString().replace('.', '')) / Math.pow(10, maxLength)).toFixed(parseInt(precious))
    } else {
        return Number(num1.toString().replace('.', '')) * Number(num2.toString().replace('.', '')) / Math.pow(10, maxLength)
    }
}
/**
 * @description:  除法运算
 * @param {*} num1 除数
 * @param {*} num2 被除数
 * @param {*} precious 精度
 * @return {*}
 */
export function $Div (num1, num2, precious = null) {
    let maxLength, num1Length, num2Length
    // 如果参数无法被转换成数字类型则返回0
    if (isNaN(Number(num1)) || isNaN(Number(num2))) {
        return 0
    }
    try {
        num1Length = num1.toString().split('.')[1].length
    } catch (e) {
        num1Length = 0
    }
    try {
        num2Length = num2.toString().split('.')[1].length
    } catch (e) {
        num2Length = 0
    }
    maxLength = num1Length - num2Length
    if (precious !== null && precious !== undefined && (!isNaN(parseInt(precious)))) {
        return Number(Number(num1.toString().replace('.', '')) / Number(num2.toString().replace('.', '')) * Math.pow(10, maxLength)).toFixed(parseInt(precious))
    } else {
        return Number(num1.toString().replace('.', '')) / Number(num2.toString().replace('.', '')) * Math.pow(10, maxLength)
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农-培杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值