js中加减乘除精度丢失问题,解决方法

众所周知在前端开发中,存在精度丢失问题,既经典问题

let a = 0.1
let b = 0.2
console.log(a + b == 0.3) //返回false


本文就不分析为什么会造成此原因,只提供解决方法

解决思路就是将所有的浮点数替换成整数模式进行 加(+)减(-)乘(*)除(/),具体代码如下:
 

/**
 * 数字相加
 * @param {*} arg1 
 * @param {*} arg2 
 * @returns 
 */
function accAdd(arg1, arg2) {
    return changeNum(arg1, arg2)
}

/**
 * 数字相减
 * @param {*} arg1 
 * @param {*} arg2 
 * @returns 
 */
function accSub(arg1, arg2) {
	return changeNum(arg1, arg2, false)
}

/**
 * 数字相乘
 * @param {*} arg1 
 * @param {*} arg2 
 * @returns 
 */
function accMul(arg1, arg2) {
	let m = 0;
	m = accAdd(m, getDecimalLength(arg1))
	m = accAdd(m, getDecimalLength(arg2))
	return getNum(arg1) * getNum(arg2) / Math.pow(10, m)
}

/**
 * 数字相除
 * @param {*} arg1 
 * @param {*} arg2 
 * @returns 
 */
function accDiv(arg1, arg2) {
	let t1, t2;
	t1 = getDecimalLength(arg1)
	t2 = getDecimalLength(arg2)
    if(t1 - t2 > 0) {
        return (getNum(arg1) / getNum(arg2)) / Math.pow(10, t1 - t2)
    } else {
        return (getNum(arg1) / getNum(arg2)) * Math.pow(10, t2 - t1)
    }
}

function changeNum(arg1 = '', arg2 = '', isAdd = true){
    function changeInteger(arg, r, maxR){
        if(r != maxR){
            let addZero = ''
            for(let i = 0; i < maxR - r; i++){
                addZero += '0'
            }
            arg = Number(arg.toString().replace('.', '') + addZero)
        }else{
            arg = getNum(arg)
        }
        return arg
    }
    let r1, r2, maxR, m;
    r1 = getDecimalLength(arg1)
    r2 = getDecimalLength(arg2)
    maxR = Math.max(r1, r2)
    arg1 = changeInteger(arg1, r1, maxR)
    arg2 = changeInteger(arg2, r2, maxR)
    m = Math.pow(10, maxR)
    if(isAdd){
        return (arg1 + arg2) / m
    }else{
        return (arg1 - arg2) / m
    }
}

function getDecimalLength(arg = ''){
    try {
        return arg.toString().split(".")[1].length
    } catch (e) {
        return 0
    }
}

function getNum(arg = ''){
    return Number(arg.toString().replace(".", ""))
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值