JS处理高精度小数计算(使用bignumber.js)

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XJF_XH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值