Skip to content

LimeBignumber 大数运算

一个UTS版的大数与高精度小数计算库,支持任意精度加减乘除、取整、比较、格式化、进制转换、有效位控制等,兼容uniapp/uniappx(iOS、Web、Android、鸿蒙、小程序)。

功能概述

本模块提供以下高精度数值能力:

  • 任意精度运算:加、减、乘、除、取模、幂运算
  • 比较判断:等于、大于/小于、区间判断、是否整数/有限/NaN/正/负/零
  • 有效数字与舍入:支持9种舍入模式、保留小数位、有效数字位(sd/precision)
  • 进制与字符串转换:十进制、其他进制(2-36)、科学计数法、定点表示法
  • 实用函数:绝对值、取反、取整、平方根、移动小数点(shiftedBy)、整数除法(idiv)

文档链接

📚 组件详细文档请访问以下站点:

安装方法

  1. 在uni-app插件市场入口 中搜索并导入lime-bignumber
  2. 非源码APP需要自定义基座
  3. 请先在页面上引入插件后再自定义基座

使用方法

ts
// 推荐:从模块中获取 BigNumber 类
import { BigNumber } from '@/uni_modules/lime-bignumber'

// 创建实例
const x = new BigNumber('123.456')
const y = new BigNumber(10)

使用示例

基本运算

ts
const a = new BigNumber('0.1')
const b = new BigNumber('0.2')

// 加法
a.plus(b).toString()            // '0.3'

// 减法
b.minus(a).toString()           // '0.1'

// 乘法
b.multipliedBy(3).toString()    // '0.6'
b.times(3).toString()           // '0.6' 等价

// 除法
new BigNumber(1).dividedBy(3).toString() // '0.33333333333333333333'(默认20位小数)
new BigNumber(1).div(3).toString()       // 等价

整数除法与取模

ts
const m = new BigNumber(5)
const n = new BigNumber(3)

// 整数除法(只保留整数部分)
m.dividedToIntegerBy(n).toString() // '1'
m.idiv(n).toString()               // '1'

// 取模
m.modulo(n).toString()             // '2'
m.mod(n).toString()                // '2'

幂运算

ts
new BigNumber(2).pow(10).toString()            // '1024'
new BigNumber('9').exponentiatedBy(0.5).toString() // '3'(配合精度与舍入)

比较判断

ts
const v = new BigNumber('100.00')

v.isEqualTo('100')    // true
v.eq('100')           // true

v.isGreaterThan(99)   // true
v.gt(99)              // true

v.isGreaterThanOrEqualTo('100') // true
v.gte('100')                    // true

v.isLessThan(200)     // true
v.lt(200)             // true

v.isLessThanOrEqualTo('100') // true
v.lte('100')                 // true

// 三值比较(1:大于,-1:小于,0:相等,null:无法比较)
v.comparedTo('100')   // 0

转换与输出

ts
const num = new BigNumber('255')

// 进制字符串
num.toString(16)      // 'ff'
num.toString(2)       // '11111111'

// 数值/JSON/原始值
num.toNumber()        // 255
num.toJSON()          // '"255"'
num.valueOf()         // '255'

// 科学计数法(示例,实际以库支持为准)
new BigNumber('12345.6').toString() // 默认不强制科学计数法

有效数字与舍入

ts
const s = new BigNumber('9876.54321')

// 保留小数位(decimalPlaces / dp)
s.decimalPlaces(2).toString()  // '9876.54'
s.dp(4).toString()             // '9876.5432'

// 有效位数统计与控制
s.sd()                         // 9(默认不计尾随零)
s.sd(true)                     // 9(包含整数部分尾随零时的统计)
s.sd(6).toString()             // '9876.54'(四舍五入到6位有效数字)
s.sd(6, 0 /* ROUND_UP */).toString() // '9876.55'

// precision 等价能力(与sd保持一致)
s.precision()                  // 9
s.precision(5).toString()      // '9876.5'

小数点移动与平方根

ts
new BigNumber('1.23').shiftedBy(3).toString()   // '1230'
new BigNumber('1.23').shiftedBy(-3).toString()  // '0.00123'

new BigNumber(16).sqrt().toString()             // '4'
new BigNumber(3).sqrt().toString()              // '1.73205080756887729353'(示例值随精度配置变化)

API 概览

下表列出主要 API(每行一个函数,详见接口文件 uni_modules/lime-bignumber/utssdk/interface.uts):

函数中文名称函数名说明
构造函数new BigNumber(value, base?)创建实例;value可为字符串、数值、bigint、BigNumber;base为进制(2-36)
加法plus(n)参数n:字符串/数值/bigint/BigNumber;返回新值
减法minus(n)参数n:字符串/数值/bigint/BigNumber;返回新值
乘法multipliedBy(n)参数n:字符串/数值/bigint/BigNumber;返回新值
乘法(别名)times(n)同 multipliedBy(n)
除法dividedBy(n)参数n:字符串/数值/bigint/BigNumber;按配置保留小数
除法(别名)div(n)同 dividedBy(n)
整数除法dividedToIntegerBy(n)只保留整数部分(floor除法)
整数除法(别名)idiv(n)同 dividedToIntegerBy(n)
取模modulo(n)返回余数;受 MODULO_MODE 影响
取模(别名)mod(n)同 modulo(n)
幂运算exponentiatedBy(n, m?)指数n;可选模数m
幂运算(别名)pow(n, m?)同 exponentiatedBy(n, m?)
等于判断isEqualTo(n)返回boolean
等于判断(别名)eq(n)返回boolean
大于判断isGreaterThan(n)返回boolean
大于判断(别名)gt(n)返回boolean
大于等于isGreaterThanOrEqualTo(n)返回boolean
大于等于(别名)gte(n)返回boolean
小于判断isLessThan(n)返回boolean
小于判断(别名)lt(n)返回boolean
小于等于isLessThanOrEqualTo(n)返回boolean
小于等于(别名)lte(n)返回boolean
三值比较comparedTo(n)返回1/-1/0/null
转字符串toString(base?)支持2-36进制;返回字符串
转数字toNumber()转原生number(可能丢失精度)
转JSONtoJSON()返回JSON字符串
原始值valueOf()返回字符串表示值
绝对值absoluteValue()返回新值
绝对值(别名)abs()同 absoluteValue()
取反negated()返回新值(-x)
取整integerValue(rm?)可选舍入模式;返回新值
保留小数位decimalPlaces(dp, rm?)设置小数位;返回新值
保留小数位(别名)dp(dp, rm?)同 decimalPlaces(dp, rm?)
有效位统计sd(includeZeros?)返回有效位数或null
保留有效数字sd(significantDigits, rm?)返回新值(按有效数字舍入)
有效位统计precision(includeZeros?)返回有效位数或null
保留有效数字precision(significantDigits, rm?)返回新值(按有效数字舍入)
小数点移动shiftedBy(n)小数点移动n位;返回新值
平方根sqrt()返回平方根;按 DECIMAL_PLACES/ROUNDING_MODE 舍入
有限判断isFinite()返回boolean
整数判断isInteger()返回boolean
NaN判断isNaN()返回boolean
负数判断isNegative()返回boolean
正数判断isPositive()返回boolean
零判断isZero()返回boolean
本地化格式化(未实现)toFormat(decimalPlaces?, roundingMode?, format?)千分位/分组/分隔符;返回字符串

完整方法、参数与行为说明请参考接口定义文件中的注释与示例。

配置项与模式

支持的配置项(未实现):

  • DECIMAL_PLACES:最大小数位数(默认20)
  • ROUNDING_MODE:舍入模式(0-8,默认4-ROUND_HALF_UP)
  • EXPONENTIAL_AT:指数显示阈值
  • RANGE:数值范围限制
  • CRYPTO:是否使用加密安全随机数生成器
  • MODULO_MODE:模运算模式(0,1,3,6,9)
  • POW_PRECISION:幂运算精度
  • FORMAT:格式化选项(千分位、分隔符、分组大小、前后缀等)
  • ALPHABET:自定义进制字符表(用于toString(base))

舍入模式(0-8)常见含义:

  • 0 ROUND_UP:向上舍入
  • 1 ROUND_DOWN:向下舍入
  • 2 ROUND_CEIL:向正无穷舍入
  • 3 ROUND_FLOOR:向负无穷舍入
  • 4 ROUND_HALF_UP:四舍五入(远离零)
  • 5 ROUND_HALF_DOWN:五舍六入(靠近零)
  • 6 ROUND_HALF_EVEN:银行家舍入
  • 7 ROUND_HALF_CEIL:等距时向正无穷
  • 8 ROUND_HALF_FLOOR:等距时向负无穷

模运算模式(0/1/3/6/9):

  • 1 ROUND_DOWN(常用)
  • 9 EUCLID(欧几里得除法,未实现)

进制与格式化

  • 进制转换:toString(base) 支持 2-36,字母表可通过 ALPHABET 配置
  • 格式化输出:可通过 FORMAT 指定分组与分隔符,toFormat(...)(未实现)生成本地化字符串

常见问题

  1. iOS普通授权下无法使用,需要源码版才行
  2. 鸿蒙Next普通授权下无法使用,需要源码版才行
  3. 非源码APP需要自定义基座并确保插件已在页面中引用
  4. 对于极大/极小数与复杂格式化,请结合 DECIMAL_PLACES、ROUNDING_MODE 与 FORMAT 配置

支持与赞赏

如果你觉得本插件解决了你的问题,可以考虑支持作者:

支付宝赞助微信赞助

源代码

组件源码