JavaScript存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,像一些加减乘除的前端计算。 为什么JavaScript会有精度问题? 因为JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。
1、引入bignumber.js
// 转为 bignumber
const x = new BigNumber('123.123456')
// 加法
0.1 + 0.2
console.log('正常0.1 + 0.2=',0.1 + 0.2) // 0.30000000000000004
let x = new BigNumber(0.1).plus(0.2).toNumber() // 0.3
// 减法
0.3 - 0.1
console.log('正常0.3 - 0.1=',0.3 - 0.1) // 0.19999999999999998
let x2 = new BigNumber(0.3).minus(0.1).toNumber() // 0.2
// 乘法
0.6 * 3
console.log('正常0.6 * 3=',0.6 * 3) // 1.7999999999999998
let x3 = new BigNumber(0.6).multipliedBy(3).toNumber() // 1.8
// 除法
335 / 6
let x4 = new BigNumber(335).div(6).toNumber() // 55.833333333333336
new BigNumber(335).div(6).dp(3).toNumber() ---确定小数位数,取三位小数
new BigNumber(335).idiv(6).toNumber() //55 ---返回整数
// 这里插入一下dp取小数点位数及取整的用法
//取几位小数进行舍入
let x_dp = new BigNumber(1234.56)
console.log(x_dp.dp()) // 如果不传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向下取整,(如果数字直接截断可以用这个)
//-取余
1 % 0.9
console.log('正常1 % 0.9=',1 % 0.9) // 0.09999999999999998
let x5 = new BigNumber(1).modulo(0.9).toNumber()
// 比较大小
let x6 = new BigNumber(1)
console.log(x6.eq(1)) //是否相等
console.log(x6.gt(-1)) //是否大于
console.log(x6.gte(1)) //是否大于等于
console.log(x6.lt(1)) //是否小于
console.log(x6.lte(1)) //是否小于等于
// 取非,改变数字的正负号
let x7 = new BigNumber(1)
console.log(x7.negated().toNumber())
//求最大值,最小值
let x6 = [2222, 3333, '4444']
console.log(BigNumber.max(...x6).toNumber()) // 最大值 4444
console.log(BigNumber.min(...x6).toNumber()) // 最小值 2222
//求和
let x7 = BigNumber.sum('11', 23).toNumber() // 34
// 多个参数求和
let arr = [2, new BigNumber(14), '15.9999', 12]
let x8 = BigNumber.sum(...arr).toString() // '43.9999'
//生成伪随机数,传入参数决定小数位数
console.log(BigNumber.random().toNumber()) // 0.1501651215311695
console.log(BigNumber.random(3).toNumber()) // 0.150