JavaScript計算丟失精度問題

js中計算

0.1+0.2 = 0.30000000000000004
655.4222/100.0 = 6.554221999999999
1.0-0.9 = 0.09999999999999998
65.4*100 = 6540.000000000001

解決上述問題,找到了一個最簡便的方法

https://blog.csdn.net/zf18234031156/article/details/81065431

可是,

image

出現(xiàn)上述問題了又

如果用的vue可以參考下這個
https://github.com/nefe/number-precision

一下是修改之后的方法

var CMX = CMX || {}
/**
 ** 加
 **/
CMX.add = function (arg1, arg2) {
    arg1 = arg1 !== undefined && arg1 !== '' ? parseFloat(arg1) : 0
    arg2 = arg2 !== undefined && arg2 !== '' ? parseFloat(arg2) : 0
    var r1, r2, m, c
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    c = Math.abs(r1 - r2)
    m = Math.pow(10, Math.max(r1, r2))
    if (c > 0) {
        var cm = Math.pow(10, c)
        if (r1 > r2) {
            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(".", ""))
    }
    return (arg1 + arg2) / m
}

/**
 ** 減
 **/
CMX.sub = function (arg1, arg2) {
    arg1 = arg1 !== undefined && arg1 !== '' ? parseFloat(arg1) : 0
    arg2 = arg2 !== undefined && arg2 !== '' ? parseFloat(arg2) : 0
    var r1, r2, m, n
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2)) //last modify by deeka //動態(tài)控制精度長度
    n = (r1 >= r2) ? r1 : r2
    return Number(((arg1 * m - arg2 * m) / m).toFixed(n))
}

/**
 ** 乘
 **/
CMX.mul = function (arg1, arg2) {
    arg1 = arg1 !== undefined && arg1 !== '' ? parseFloat(arg1) : 0
    arg2 = arg2 !== undefined && arg2 !== '' ? parseFloat(arg2) : 0
    if (arg1 === 0 || arg2 === 0) {
        return 0
    }
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString()
    try {
        m += s1.split(".")[1].length
    } catch (e) {
    }
    try {
        m += s2.split(".")[1].length
    } catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

/**
 ** 除
 **/
CMX.div = function (arg1, arg2) {
    let t1 = 0, t2 = 0, t3, r1 = 0, r2 = 0, r3, r4
    if (String(arg1) === '' || String(arg2) === '' || parseFloat(arg1) === 0 || parseFloat(arg2) === 0) return 0
    try {
        // 不存在小數(shù)點
        let pointIndex1 = String(arg1).indexOf(".")
        arg1 = parseFloat(arg1)
        t1 = pointIndex1 === -1 || String(arg1).charAt(pointIndex1 + 1).length === 0 ? 0 : String(arg1).split(".")[1].length
        if (t1 !== 0) {
            r1 = String(parseFloat(arg1)).replace(".","")
        } else {
            r1 = parseFloat(arg1)
        }
    } catch (e) {
        console.error(e)
    }
    try {
        let pointIndex2 = String(arg2).indexOf(".")
        arg2 = parseFloat(arg2)
        t2 = String(arg2).indexOf(".") === -1 || String(arg2).charAt(pointIndex2 + 1).length === 0 ? 0 : String(arg2).split(".")[1].length
        if (t2 !== 0) {
            r2 = String(parseFloat(arg2)).replace(".","")
        } else {
            r2 = parseFloat(arg2)
        }
    } catch (e) {
        console.error(e)
    }
    r3 = r1 / r2
    t3 = String(r3).indexOf(".") === -1 ? 0 : String(r3).split(".")[1].length
    r4 = String(parseFloat(r3)).replace(".","")
    if (t2 > t1) {
        return (r4 * Math.pow(10, t2 - t1)) / Math.pow(10, t3)
    } else if (t2 < t1) {
        return r4 / Math.pow(10, t1 - t2 + t3)
    } else {
        return r3
    }
}

歡迎測試一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容