JS處理數學計算之痛
阿新 • • 發佈:2021-12-24
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地址:https://github.com/josdejong/mathjs.git
測試:
<!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>
第二個推薦外掛
測試:
<!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類。反正完全能夠滿足公司業務需求。