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地址: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类。反正完全能够满足公司业务需求。