欢迎点击: 个人官网博客
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源码)