目 录CONTENT

文章目录

使用bignumber.js库,处理JS小数浮点数计算精度问题

FanJunyang
2023-05-25 / 0 评论 / 1 点赞 / 1382 阅读 / 0 字
温馨提示:
本文最后更新于2024-08-14,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

安装

npm install bignumber.js
or
yarn add bignumber.js

静态方法

静态方法调用后一般返回 BigNumber 实例

config

给构造函数设置参数

DECIMAL_PLACES

设置小数位数

BigNumber.config({ DECIMAL_PLACES: 4 })
BigNumber.random().toNumber() // 0.7793

sum

计算传入的参数和,参数类型可以是 String,Number

// 两数之和
var x = BigNumber.sum('11', 23)
x.toNumber() // 34

// 多个参数
arr = [2, new BigNumber(14), '15.9999', 12]
var y = BigNumber.sum(...arr)
y.toString() // '43.9999'

clone

生成 bignumber 构造函数

var X = BigNumber.clone()
var y = new X()
y // bignumber实例

isBigNumber

判断是否是 bignumber 实例,通过 clone 的构造函数生成的实例仍然是 bignumber 实例,但是原型与 BigNumber 原型不同

var y = new BigNumber(2)
BigNumber.isBigNumber(y) // true
y instanceof BigNumber // true

var BN = BigNumber.clone()
z = new BN(x)
z instanceof BigNumber // false
BigNumber.isBigNumber(z) // true

maximum,minimum

求最大值,简写 max,min

var x = [2222, 3333, '4444']
BigNumber.max(...x).toNumber() // 4444
BigNumber.min(...x).toNumber() // 2222

random

生成伪随机数,传入参数决定小数位数

BigNumber.random().toNumber() // 0.1501651215311695
BigNumber.random(3).toNumber() // 0.150

实例方法

negated

相反数

var x = new BigNumber(1.8)
x.negated() // -1.8

absoluteValue(abs)

绝对值

var x = new BigNumber(-0.01)
x.abs().toNumber() // 0.01

comparedTo

比较两数,返回值: 1: 大于 -1:小于 0:等于 null:比较值出现 NaN

var x = new BigNumber(Infinity)
var y = new BigNumber(5)
var z = new BigNumber(5)
x.comparedTo(y) // 1
y.comparedTo(x) // -1
y.comparedTo(z) // 0
y.comparedTo(NaN) // null

decimalPlaces(dp)

确定小数位数

var x = new BigNumber(1234.5678912345)
var y = new BigNumber(1234.56)
x.dp(2).toNumber() // 1234.56
y.dp(10).toNumber() // 1234.56

plus

加法运算

0.1 + 0.2 // 0.30000000000000004
var x = new BigNumber(0.1)
x.plus(0.2).toNumber() // 0.3

minus

减法运算

0.3 - 0.1 // 0.19999999999999998
var x = new BigNumber(0.3)
x.minus(0.1) // 0.2

multipliedBy(times)

乘法运算

0.6 * 3 // 1.7999999999999998
var x = new BigNumber(0.6)
x.times(3) // 1.8

dividedBy(div)

除法运算

var x = new BigNumber(300)
x.div(3).toNumber() // 100
x.div(7).dp(3).toNumber() // 42.857

dividedToIntegerBy(idiv)

除法运算,返回整数

var x = new BigNumber(5)
x.idiv(3).toNumber() // 1
x.idiv(0.7).toNumber() // 7

modulo(mod)

取余

1 % 0.9 // 0.09999999999999998
var x = new BigNumber(1)
x.mod(0.9).toNumber() // 0.1

exponentiatedBy(pow)

幂运算

Math.pow(0.7, 2) // 0.48999999999999994
var x = BigNumber(0.7)
x.pow(2).toNumber() // 0.49

integerValue

取整,参数取值参考 Properties

var x = new BigNumber(123.456)
x.integerValue().toNumber() // 123
x.integerValue(BigNumber.ROUND_CEIL).toNumber() // 124

isEqualTo(eq)

比较两数是否相等,NaN 不等于 NaN

0 === 1e-324 // js中
var x = new BigNumber(0)
x.eq('1e-324') // false

var y = new BigNumber(NaN)
y.eq(NaN) // false

isFinite

判断数字是否有效

var x = new BigNumber(1)
x.isFinite() // true

var y = new BigNumber(Infinity)
y.isFinite() // false

var z = new BigNumber(NaN)
z.isFinite() // false

isGreaterThan(gt)

0.1 > 0.3 - 0.2 // true
var x = new BigNumber(0.1)
x.gt(BigNumber(0.3).minus(0.2)) // false

isGreaterThanOrEqualTo(gte)

判断是否大于等于某数,用法同 isGreaterThan

isLessThan(lt)

判断是否小于某数,用法同 isGreaterThan

isLessThanOrEqualTo(lte)

判断是否小于等于某数,用法同 isGreaterThan

isNaN

判断是否是 NaN

var x = new BigNumber(NaN)
x.isNaN() // true

var y = new BigNumber(Infinity)
y.isNaN() // false

isPositive

判断是否是正数

var x = new BigNumber(-0)
x.isPositive() // false

isNegative

判断是否是负数,用法同 isPositive

isZero

判断是否是 0 或者-0

var x = new BigNumber(-0)
x.isZero() // true

toFixed

控制小数位数,不够后面补 0

var x = 3.456
var y = new BigNumber(x)
x.toFixed().toNumber() // 3
y.toFixed().toNumber() // 3.456
y.toFixed(0).toNumber() // 3
y.toFixed(2).toNumber() // 3.46
y.toFixed(5).toNumber() // 3.45600

toNumber

转 Number

toString

转 String

1
NPM
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. PayPal/U

    PayPal https://paypal.me/junyangfan
    BTC
    (Bitcoin)
    USDT
    (TRC20)
广告 广告

评论区