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

posted @ 2021-12-24 15:07  秋墨江雪  阅读(59)  评论(0编辑  收藏  举报