解决js计算精度问题BigNumber.js

欢迎点击: 个人官网博客

JavaScript存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,像一些加减乘除的前端计算。

为什么JavaScript会有精度问题?

因为JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。

不多哔哔,直接教你们怎么用bigNumber.js进行加减乘除,取余,取整取小数点等操作…

1.引入bignumber,js

<script src="https://cdn.bootcdn.net/ajax/libs/bignumber.js/9.0.1/bignumber.js"></script>

2.嗯哼,开始了

打印结果图(可对照下面源码观看):
在这里插入图片描述

       // 转为 bignumber
        const xx = new BigNumber('456465455.456465464654');
        // 转为 普通数字
        // xx.toNumber()
        // 转为 字符串
        // xx.toString()

        // 格式化(小数点)
        console.log(xx.toFormat()) // '456,465,455.456465464654'
        // console.log(xx.toFormat(3)) // '456,465,455.456'



        // 加法
        console.log('----------------加法')
        console.log('正常0.1 + 0.2=',0.1 + 0.2) // 0.30000000000000004
        let x = new BigNumber(0.1)
        let y = x.plus(0.2).toNumber() // 0.3
        console.log(BigNumber(0.7).plus(x).plus(y).toNumber()) // 1.1
        console.log(x.plus('0.1').toNumber()) // 0.2


        // 减法
        console.log('----------------减法')
        console.log('正常0.3 - 0.1=',0.3 - 0.1) // 0.19999999999999998
        let x2 = new BigNumber(0.3)
        console.log(x2.minus(0.1).toNumber()) // 0.2

        // 乘法
        console.log('----------------乘法')
        console.log('正常0.6 * 3=',0.6 * 3) // 1.7999999999999998
        let x3 = new BigNumber(0.6)
        console.log(x3.multipliedBy(3).toNumber()) // 1.8

        // 除法
        console.log('----------------除法')
        let x4 = new BigNumber(335)
        console.log(x4.div(6).toNumber()) // 55.833333333333336
        console.log(x4.div(6).dp(3).toNumber()) //55.833  ---确定小数位数,取三位小数
        console.log(x4.idiv(6).toNumber()) //55  ---返回整数

        // 这里插入一下dp取小数点位数及取整的用法
        console.log('----------------dp的用法')
        //取几位小数进行舍入
        let x_dp = new BigNumber(1234.56)
		 console.log(x_dp.dp())                       // 2  如果不传dp,则函数返回的是操作数的小数点的位数
		 console.log(x_dp.dp(10).toNumber())                     // 1234.56
		 console.log(x_dp.dp(1).toNumber())                     // 1234.6
         console.log(x_dp.toFixed(5))                   // '1234.56000'
         //取整
         console.log(x_dp.dp(0).toNumber())   //1235四舍五入
         console.log(x_dp.integerValue().toNumber())  //1235四舍五入
         console.log(x_dp.toFixed(0))                   // '1235'四舍五入
         console.log(x_dp.integerValue(BigNumber.ROUND_CEIL).toNumber()) //1235向上取整,有点Math.ceil的意思
         console.log(x_dp.integerValue(BigNumber.ROUND_DOWN).toNumber()) //1235向下取整,(如果数字直接截断可以用这个)
      


        //-----------------------取余
        console.log('----------------取余')
        console.log('正常1 % 0.9=',1 % 0.9) // 0.09999999999999998
        let x5 = new BigNumber(1)
        console.log(x5.modulo(0.9).toNumber())

        // 比较大小
        console.log('----------------比较大小')
        console.log(x5.eq(1)) //是否相等
        console.log(x5.gt(-1)) //是否大于
        console.log(x5.gte(1)) //是否大于等于
        console.log(x5.lt(1)) //是否小于
        console.log(x5.lte(1)) //是否小于等于
        // 取非,改变数字的正负号
        console.log('----------------取非,改变数字的正负号')
        console.log(x5.negated().toNumber())

        //求最大值,最小值
        console.log('----------------求最大值')
        var x6 = [2222, 3333, '4444']
        console.log(BigNumber.max(...x6).toNumber()) // 4444
        console.log(BigNumber.min(...x6).toNumber()) // 2222

        //求和
        console.log('----------------求和')
        var x7 = BigNumber.sum('11', 23)
        console.log(x7.toNumber()) // 34
        // 多个参数求和
        let arr7 = [2, new BigNumber(14), '15.9999', 12]
        var y7 = BigNumber.sum(...arr7)
        console.log(y7.toString()) // '43.9999'

        //生成伪随机数,传入参数决定小数位数
        console.log(BigNumber.random().toNumber()) // 0.1501651215311695
        console.log(BigNumber.random(3).toNumber()) // 0.150

最后喜欢就点点关注吧!!!(demo源码)

猜你喜欢

转载自blog.csdn.net/qq_41560520/article/details/114964075
今日推荐