1. 程式人生 > 其它 >JS處理數學計算之痛

JS處理數學計算之痛

JS處理數學計算之痛

比如:

2.05*1.89*1.74*10000
67416.29999999999

而實際我們需要的是:67416.30,你用計算器得到的也是這個值,而非上面那個。
0.1+0.7
0.7999999999999999
期望答案:0.8

這些問題在跟錢扯上關係後就顯得很重要,必須要去解決,至於為什麼會這樣網上大把解讀,我就不再這兒囉嗦了。我們今天想要討論的是如何解決問題。

當然在實際工作中只要能找到問題的根本原因,一般都能找到解決的辦法,很多人建議可也自己寫方法去解決,如果你足夠牛逼且有時間當然可以,但是我當前的目標就是儘快解決問題,當然網上已經有人造好輪子了。

大而全的解決方法就是使用math.js了,不過這玩意兒太大,我下載後發現有500多kb,根本就不想把他引入到專案中

GitHub地址:

測試:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
   <script src="https://cdn.bootcss.com/mathjs/5.9.0/math.min.js"></script>
</head>
<body>
<script>
    //沒有使用math.js
    console.log(1.1 * 100)  //  110.00000000000001
    console.log(0.1 + 0.2)   //  0.30000000000000004
    console.log(2.05*1.89*1.74*10000) //67416.29999999999

    function printFn(value) {
        const precision = 14
        return Number(math.format(value, precision))
    }
    //使用math.js
    console.log(printFn(1.1 * 100))  //110
    console.log(printFn(0.1 + 0.2))  //0.3
    console.log(printFn(2.05*1.89*1.74)*10000)//67416.3
</script>
</body>
</html>

第二個推薦外掛

地址:MikeMcl/decimal.js

測試:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
   <script src="https://cdn.bootcss.com/decimal.js/10.1.1/decimal.js"></script>
</head>
<body>
<script>
    //沒有使用decimal.js
    console.log(1.1 * 100)  //  110.00000000000001
    console.log(0.1 + 0.2)   //  0.30000000000000004
    console.log(2.05*1.89*1.74*10000) //

    //使用使用decimal.js
    console.log(new Decimal(1.1).mul(new Decimal(100)).toNumber())  //110
    console.log(new Decimal(0.1).plus(new Decimal(0.2)).toNumber())  //0.3
    console.log(new Decimal(2.05).mul(new Decimal(1.89)).mul(new Decimal(1.74)).mul(new Decimal(10000)).toNumber())//67416.3
</script>
</body>
</html>

當然好友其他很多庫,如:bignumber.js,還有big.js等,最後我是用了decimal.js,也就30kb左右,還能接受,操作起來有點像java的BigDecimal類。反正完全能夠滿足公司業務需求。