概述
bignumber.js 是一个用于任意精度算术运算的 JavaScript 库,托管在 GitHub 上。该库已集成到当前页面,因此现在可以在控制台中使用。
构造函数
BigNumber(n [, base]) ⇒ BigNumber
返回一个新的 BigNumber 对象实例,其值为 n
,n
是指定基数的数值,若省略或基数为 null/undefined,则为十进制。
**示例:**
javascript
x = new BigNumber(123.4567); // '123.4567'
// 'new' 是可选的
y = BigNumber(x); // '123.4567'

如果 n
是十进制值,可以是普通(定点)或指数表示法。其他基数的值必须是普通表示法。任何基数的值都可以有小数位,即小数点后的数字。
javascript
new BigNumber(43210); // '43210'
new BigNumber('4.321e+4'); // '43210'
new BigNumber('-735.0918e-430'); // '-7.350918e-428'
new BigNumber('123412421.234324', 5); // '607236.557696'
支持带符号的 0、带符号的 Infinity 和 NaN。
javascript
new BigNumber('-Infinity'); // '-Infinity'
new BigNumber(NaN); // 'NaN'
new BigNumber(-0); // '0'
new BigNumber('.5'); // '0.5'
new BigNumber('+2'); // '2'
十六进制字面值形式的字符串值,例如 '0xff' 或 '0xFF'(但不是 '0xfF')是有效的,八进制和二进制前缀 '0o' 和 '0b' 的字符串值也是有效的。没有前缀的八进制字面值形式的字符串值将被解释为十进制,例如 '011' 被解释为 11,而不是 9。
javascript
new BigNumber(-10110100.1, 2); // '-180.5'
new BigNumber('-0b10110100.1'); // '-180.5'
new BigNumber('ff.8', 16); // '255.5'
new BigNumber('0xff.8'); // '255.5'
如果指定了基数,n
将根据当前的 DECIMAL_PLACES 和 ROUNDING_MODE 设置进行舍入。这包括十进制,因此除非需要此行为,否则不要为十进制值包含基数参数。
javascript
BigNumber.config({ DECIMAL_PLACES: 5 });
new BigNumber(1.23456789); // '1.23456789'
new BigNumber(1.23456789, 10); // '1.23457'
如果基数无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
对于字符串类型的值,其位数没有限制(除了 JavaScript 的最大数组大小)。有关设置 BigNumber 的最大和最小可能指数值,请参阅 RANGE。
javascript
new BigNumber('5032485723458348569331745.33434346346912144534543');
new BigNumber('4.321e10000000');
如果 n
无效,则返回 BigNumber NaN(除非 BigNumber.DEBUG 为 true,见下文)。
javascript
new BigNumber('.1*'); // 'NaN'
new BigNumber('blurgh'); // 'NaN'
new BigNumber(9, 2); // 'NaN'
为了帮助调试,如果 BigNumber.DEBUG 为 true,则在 n
无效时将抛出错误。如果 n
是类型为数字且有效数字超过 15 位,也会抛出错误,因为对这些数字调用 toString 或 valueOf 可能不会产生预期的值。
javascript
console.log(823456789123456.3); // 823456789123456.2
new BigNumber(823456789123456.3); // '823456789123456.2'
BigNumber.DEBUG = true;
// '[BigNumber Error] Number primitive has more than 15 significant digits'
new BigNumber(823456789123456.3);
// '[BigNumber Error] Not a base 2 number'
new BigNumber(9, 2);
BigNumber 也可以从对象字面量创建。使用 isBigNumber 检查其是否格式正确。
javascript
new BigNumber({ s: 1, e: 2, c: [ 777, 12300000000000 ], _isBigNumber: true }); // '777.123'
方法
静态方法
clone .clone ([object]) ⇒ BigNumber 构造函数
返回一个新的独立 BigNumber 构造函数,其配置如 object 所述(请参阅 config),如果 object 为 null 或 undefined,则使用默认配置。
如果 object 不是对象,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
BigNumber.config({ DECIMAL_PLACES: 5 });
BN = BigNumber.clone({ DECIMAL_PLACES: 9 });
x = new BigNumber(1);
y = new BN(1);
x.div(3); // 0.33333
y.div(3); // 0.333333333
// BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) 等效于:
BN = BigNumber.clone();
BN.config({ DECIMAL_PLACES: 9 });
configset([object]) ⇒ object
为这个特定的 BigNumber 构造函数配置设置。
DECIMAL_PLACES
-
数字:整数,范围在 0 到 1e+9 之间
-
默认值:20
涉及除法的操作结果的最大小数位数,即除法、平方根和基数转换操作,以及负指数的幂运算。
javascript
BigNumber.config({ DECIMAL_PLACES: 5 });
BigNumber.set({ DECIMAL_PLACES: 5 }); // 等效
ROUNDING_MODE
-
数字:整数,范围在 0 到 8 之间
-
默认值:4(ROUND_HALF_UP)
上述操作中使用的舍入模式,以及 decimalPlaces、precision、toExponential、toFixed、toFormat 和 toPrecision 的默认舍入模式。
这些模式可作为 BigNumber 构造函数的枚举属性使用。
javascript
BigNumber.config({ ROUNDING_MODE: 0 });
BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP }); // 等效
EXPONENTIAL_AT
toString 返回指数表示法时的指数值。
如果分配单个数字,则该值为指数绝对值。
如果分配一个包含两个数字的数组,则第一个数字是使用指数表示法的负指数值及以下,第二个数字是使用指数表示法的正指数值及以上。
例如,要模拟 JavaScript 数字开始使用指数表示法的指数值,请使用 [-7, 20]。
javascript
BigNumber.config({ EXPONENTIAL_AT: 2 });
new BigNumber(12.3); // '12.3' e 仅为 1
new BigNumber(123); // '1.23e+2'
new BigNumber(0.123); // '0.123' e 仅为 -1
new BigNumber(0.0123); // '1.23e-2'
BigNumber.config({ EXPONENTIAL_AT: [-7, 20] });
new BigNumber(123456789); // '123456789' e 仅为 8
new BigNumber(0.000000123); // '1.23e-7'
// 几乎从不返回指数表示法:
BigNumber.config({ EXPONENTIAL_AT: 1e+9 });
// 始终返回指数表示法:
BigNumber.config({ EXPONENTIAL_AT: 0 });
无论 EXPONENTIAL_AT 的值如何,toFixed 方法始终返回普通表示法,toExponential 方法始终返回指数形式。
使用基数参数调用 toString,例如 toString (10),也将始终返回普通表示法。
RANGE
超出此范围的指数值将溢出为 Infinity 或下溢为零。
如果分配单个数字,则为最大指数绝对值:正指数大于该绝对值的值变为 Infinity,负指数大于该绝对值的值变为零。
如果分配一个包含两个数字的数组,则第一个数字是负指数限制,第二个数字是正指数限制。
例如,要模拟 JavaScript 数字变为零和 Infinity 的指数值,请使用 [-324, 308]。
javascript
BigNumber.config({ RANGE: 500 });
BigNumber.config().RANGE; // [ -500, 500 ]
new BigNumber('9.999e499'); // '9.999e+499'
new BigNumber('1e500'); // 'Infinity'
new BigNumber('1e-499'); // '1e-499'
new BigNumber('1e-500'); // '0'
BigNumber.config({ RANGE: [-3, 4] });
new BigNumber(99999); // '99999' e 仅为 4
new BigNumber(100000); // 'Infinity' e 为 5
new BigNumber(0.001); // '0.01' e 仅为 -3
new BigNumber(0.0001); // '0' e 为 -4
有限 BigNumber 的最大可能绝对值为 9.999...e+1000000000。
非零 BigNumber 的最小可能绝对值为 1e-1000000000。
CRYPTO
-
布尔值:true 或 false
-
默认值:false
确定是否使用加密安全的伪随机数生成的值。
如果 CRYPTO 设置为 true,则 random 方法将在支持的浏览器中使用 crypto.getRandomValues 生成随机数字,或在使用 Node.js 时使用 crypto.randomBytes。
如果宿主环境不支持这两个函数,则尝试将 CRYPTO 设置为 true 将失败并抛出异常。
如果 CRYPTO 为 false,则使用的随机源将是 Math.random(假定其生成至少 30 位的随机性)。
javascript
// Node.js
global.crypto = require('crypto');
BigNumber.config({ CRYPTO: true });
BigNumber.config().CRYPTO; // true
BigNumber.random(); // 0.54340758610486147524
MODULO_MODE
-
数字:整数,范围在 0 到 9 之间
-
默认值:1(ROUND_DOWN)
计算模数 a mod n 时使用的模数模式。
商 q = a /n 根据与所选 MODULO_MODE 对应的 ROUNDING_MODE 计算。
余数 r 计算为:r = a - n * q。
下表显示了模数 / 余数操作中最常用的模式。尽管可以使用其他舍入模式,但它们可能不会产生有用的结果。
属性 |
值 |
描述 |
ROUND_UP |
0 |
如果被除数为负,余数为正,否则为负 |
ROUND_DOWN |
1 |
余数与被除数符号相同 |
ROUND_FLOOR |
3 |
余数与除数符号相同 |
ROUND_HALF_EVEN |
6 |
IEEE 754 余数函数 |
EUCLID |
9 |
余数始终为正 |
舍入 / 模数模式可作为 BigNumber 构造函数的枚举属性使用。
javascript
BigNumber.config({ MODULO_MODE: BigNumber.EUCLID });
BigNumber.config({ MODULO_MODE: 9 }); // 等效
POW_PRECISION
-
数字:整数,范围在 0 到 1e+9 之间
-
默认值:0
幂运算结果的最大精度,即有效数字位数(除非指定模数)。
如果设置为 0,则有效数字位数不受限制。
javascript
BigNumber.config({ POW_PRECISION: 100 });
FORMAT
FORMAT 对象配置 toFormat 方法返回的字符串格式。
下面的示例显示了识别的 FORMAT 对象的属性及其默认值。
与其他配置属性不同,FORMAT 对象的属性值不会检查有效性。现有的 FORMAT 对象将简单地被传入的对象替换。该对象可以包含下面显示的任何数量的属性。
javascript
BigNumber.config({
FORMAT: {
// 要前置的字符串
prefix: '',
// 小数分隔符
decimalSeparator: '.',
// 整数部分的分组分隔符
groupSeparator: ',',
// 整数部分的主要分组大小
groupSize: 3,
// 整数部分的次要分组大小
secondaryGroupSize: 0,
// 小数部分的分组分隔符
fractionGroupSeparator: ' ',
// 小数部分的分组大小
fractionGroupSize: 0,
// 要附加的字符串
suffix: ''
}
});
ALPHABET
用于基数转换的字母表。字母表的长度对应于可以传递给 BigNumber 构造函数或 toString 的基数参数的最大值。
字母表没有最大长度,但必须至少包含 2 个字符,并且不能包含空格或重复字符,也不能包含符号指示符 '+' 和 '-',或小数分隔符 '.'。
javascript
// 十二进制(基数 12)
BigNumber.config({ ALPHABET: '0123456789TE' });
x = new BigNumber('T', 12);
x.toString(); // '10'
x.toString(12); // 'T'
返回包含上述属性及其当前值的对象。
如果 object 不是对象,或者为上述属性之一分配了无效值,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
BigNumber.config({
DECIMAL_PLACES: 40,
ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL,
EXPONENTIAL_AT: [-10, 20],
RANGE: [-500, 500],
CRYPTO: true,
MODULO_MODE: BigNumber.ROUND_FLOOR,
POW_PRECISION: 80,
FORMAT: {
groupSize: 3,
groupSeparator: ' ',
decimalSeparator: ','
},
ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'
});
obj = BigNumber.config();
obj.DECIMAL_PLACES; // 40
obj.RANGE; // [-500, 500]
isBigNumber.isBigNumber(value) ⇒ boolean
如果 value 是 BigNumber 实例,则返回 true,否则返回 false。
javascript
x = 42;
y = new BigNumber(x);
BigNumber.isBigNumber(x); // false
y instanceof BigNumber; // true
BigNumber.isBigNumber(y); // true
BN = BigNumber.clone();
z = new BN(x);
z instanceof BigNumber; // false
BigNumber.isBigNumber(z); // true
如果 value 是 BigNumber 实例且 BigNumber.DEBUG 为 true,则此方法还将检查 value 是否格式正确,如果不正确则抛出错误。有关错误信息,请参阅 “错误” 部分。
此检查在从对象字面量创建 BigNumber 时很有用。
javascript
x = new BigNumber(10);
// 更改 x.c 为非法值
x.c = NaN;
BigNumber.DEBUG = false;
// 无错误
BigNumber.isBigNumber(x); // true
BigNumber.DEBUG = true;
// 错误
BigNumber.isBigNumber(x); // '[BigNumber Error] Invalid BigNumber'
maximum.max(n...) ⇒ BigNumber
返回值为参数中最大值的 BigNumber。
返回值始终精确且未舍入。
javascript
x = new BigNumber('3257869345.0378653');
BigNumber.maximum(4e9, x, '123456789.9'); // '4000000000'
arr = [12, '13', new BigNumber(14)];
BigNumber.max.apply(null, arr); // '14'
minimum.min(n...) ⇒ BigNumber
返回值为参数中最小值的 BigNumber。
返回值始终精确且未舍入。
javascript
x = new BigNumber('3257869345.0378653');
BigNumber.minimum(4e9, x, '123456789.9'); // '123456789.9'
arr = [2, new BigNumber(-14), '-15.9999', -12];
BigNumber.min.apply(null, arr); // '-15.9999'
random.random([dp]) ⇒ BigNumber
返回一个新的 BigNumber,其伪随机值等于或大于 0 且小于 1。
返回值将有 dp 位小数(如果产生 trailing zeros,则可能更少)。
如果省略 dp,则小数位数默认为当前 DECIMAL_PLACES 设置。
根据此 BigNumber 构造函数的 CRYPTO 设置和宿主环境对 crypto 对象的支持,返回值的随机数字由 Math.random(最快)、crypto.getRandomValues(最新浏览器中的 Web Cryptography API)或 crypto.randomBytes(Node.js)生成。
在 Node.js 中使用时,要能够将 CRYPTO 设置为 true,必须全局可用 crypto 对象:
javascript
global.crypto = require('crypto');
如果 CRYPTO 为 true,即使用其中一种 crypto 方法,返回的 BigNumber 的值应是加密安全的,并且在统计上与随机值无法区分。
如果 dp 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
BigNumber.config({ DECIMAL_PLACES: 10 });
BigNumber.random(); // '0.4117936847'
BigNumber.random(20); // '0.78193327636914089009'
sum.sum(n...) ⇒ BigNumber
返回值为参数之和的 BigNumber。
返回值始终精确且未舍入。
javascript
x = new BigNumber('3257869345.0378653');
BigNumber.sum(4e9, x, '123456789.9'); // '7381326134.9378653'
arr = [2, new BigNumber(14), '15.9999', 12];
BigNumber.sum.apply(null, arr); // '43.9999'
枚举属性
库的枚举舍入模式存储为构造函数的属性。
(它们本身不被库内部引用。)
舍入模式 0 到 6(含)与 Java 的 BigDecimal 类的舍入模式相同。
属性 |
值 |
描述 |
ROUND_UP |
0 |
远离零舍入 |
ROUND_DOWN |
1 |
向零舍入 |
ROUND_CEIL |
2 |
向 Infinity 舍入 |
ROUND_FLOOR |
3 |
向 -Infinity 舍入 |
ROUND_HALF_UP |
4 |
向最近的邻居舍入。如果等距,远离零舍入 |
ROUND_HALF_DOWN |
5 |
向最近的邻居舍入。如果等距,向零舍入 |
ROUND_HALF_EVEN |
6 |
向最近的邻居舍入。如果等距,向偶数邻居舍入 |
ROUND_HALF_CEIL |
7 |
向最近的邻居舍入。如果等距,向 Infinity 舍入 |
ROUND_HALF_FLOOR |
8 |
向最近的邻居舍入。如果等距,向 -Infinity 舍入 |
javascript
BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_CEIL });
BigNumber.config({ ROUNDING_MODE: 2 }); // 等效
DEBUG
如果 BigNumber.DEBUG 设置为 true,则当此 BigNumber 构造函数接收到无效值时将抛出错误,例如有效数字超过 15 位的数字类型值。
当 isBigNumber 方法接收到格式不正确的 BigNumber 时,也将抛出错误。
javascript
BigNumber.DEBUG = true;
实例方法
BigNumber 实例从其构造函数的原型对象继承的方法。
BigNumber 是不可变的,即其方法不会更改它。
对 ±0、±Infinity 和 NaN 的处理与 JavaScript 对这些值的处理一致。
许多方法名有较短的别名。
absoluteValue.abs() ⇒ BigNumber
返回值为该 BigNumber 值的绝对值(即大小)的 BigNumber。
返回值始终精确且未舍入。
javascript
x = new BigNumber(-0.8);
y = x.absoluteValue(); // '0.8'
z = y.abs(); // '0.8'
comparedTo.comparedTo(n [, base]) ⇒ number
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回:
-
1:如果此 BigNumber 的值大于 n 的值
-
-1:如果此 BigNumber 的值小于 n 的值
-
0:如果此 BigNumber 和 n 的值相同
-
null:如果此 BigNumber 或 n 的值为 NaN
javascript
x = new BigNumber(Infinity);
y = new BigNumber(5);
x.comparedTo(y); // 1
x.comparedTo(x.minus(1)); // 0
y.comparedTo(NaN); // null
y.comparedTo('110', 2); // -1
decimalPlaces.dp([dp [, rm]]) ⇒ BigNumber|number
-
dp
:数字,整数,范围在 0 到 1e+9 之间
-
rm
:数字,整数,范围在 0 到 8 之间
如果 dp 是数字,返回值为该 BigNumber 的值使用舍入模式 rm 舍入到最多 dp 位小数的 BigNumber。
如果省略 dp,或 dp 为 null 或 undefined,返回值为该 BigNumber 值的小数位数,或者如果该 BigNumber 的值为 ±Infinity 或 NaN,则为 null。
如果省略 rm,或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 dp 或 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(1234.56);
x.decimalPlaces(1); // '1234.6'
x.dp(); // 2
x.decimalPlaces(2); // '1234.56'
x.dp(10); // '1234.56'
x.decimalPlaces(0, 1); // '1234'
x.dp(0, 6); // '1235'
x.decimalPlaces(1, 1); // '1234.5'
x.dp(1, BigNumber.ROUND_HALF_EVEN); // '1234.6'
x; // '1234.56'
y = new BigNumber('9.9e-101');
y.dp(); // 102
dividedBy.div(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值除以 n 的 BigNumber,根据当前 DECIMAL_PLACES 和 ROUNDING_MODE 设置进行舍入。
javascript
x = new BigNumber(355);
y = new BigNumber(113);
x.dividedBy(y); // '3.14159292035398230088'
x.div(5); // '71'
x.div(47, 16); // '5'
dividedToIntegerBy.idiv(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值除以 n 的整数部分的 BigNumber。
javascript
x = new BigNumber(5);
y = new BigNumber(3);
x.dividedToIntegerBy(y); // '1'
x.idiv(0.7); // '7'
x.idiv('0.f', 16); // '5'
exponentiatedBy.pow(n [, m]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber,整数
-
m
:数字、字符串或 BigNumber
返回值为该 BigNumber 的值的 n 次幂的 BigNumber,即 x^n,并可选模 m。
如果 n 不是整数,则抛出错误。有关错误信息,请参阅 “错误” 部分。
如果 n 为负,结果根据当前 DECIMAL_PLACES 和 ROUNDING_MODE 设置进行舍入。
由于幂运算结果的位数可能快速增长,例如 123.456^10000 有超过 50000 位,因此计算的有效数字位数受 POW_PRECISION 设置的限制(除非指定模数 m)。
默认情况下,POW_PRECISION 设置为 0。这意味着将计算无限数量的有效数字,并且对于较大的指数,该方法的性能将急剧下降。
如果指定了 m,并且 m、n 和此 BigNumber 的值都是整数,且 n 为正,则使用快速模幂算法,否则操作将按 x.exponentiatedBy (n).modulo (m) 执行,POW_PRECISION 为 0。
javascript
Math.pow(0.7, 2); // 0.48999999999999994
x = new BigNumber(0.7);
x.exponentiatedBy(2); // '0.49'
BigNumber(3).pow(-2); // '0.11111111111111111111'
integerValue.integerValue([rm]) ⇒ BigNumber
返回值为该 BigNumber 的值使用舍入模式 rm 舍入为整数的 BigNumber。
如果省略 rm,或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(123.456);
x.integerValue(); // '123'
x.integerValue(BigNumber.ROUND_CEIL); // '124'
y = new BigNumber(-12.7);
y.integerValue(); // '-13'
y.integerValue(BigNumber.ROUND_DOWN); // '-12'
以下是如何添加一个模拟 JavaScript 的 Math.round 函数的原型方法的示例。Math.ceil、Math.floor 和 Math.trunc 可以用 BigNumber.ROUND_CEIL、BigNumber.ROUND_FLOOR 和 BigNumber.ROUND_DOWN 以相同方式模拟。
javascript
BigNumber.prototype.round = function () {
return this.integerValue(BigNumber.ROUND_HALF_CEIL);
};
x.round(); // '123'
isEqualTo.eq(n [, base]) ⇒ boolean
-
n
:数字、字符串或 BigNumber
-
base
:数字
如果此 BigNumber 的值等于 n 的值,则返回 true,否则返回 false。
与 JavaScript 一样,NaN 不等于 NaN。
注意:此方法内部使用 comparedTo 方法。
javascript
0 === 1e-324; // true
x = new BigNumber(0);
x.isEqualTo('1e-324'); // false
BigNumber(-0).eq(x); // true ( -0 === 0 )
BigNumber(255).eq('ff', 16); // true
y = new BigNumber(NaN);
y.isEqualTo(NaN); // false
isFinite.isFinite() ⇒ boolean
如果该 BigNumber 的值是有限数,则返回 true,否则返回 false。
BigNumber 的唯一可能的非有限值是 NaN、Infinity 和 -Infinity。
javascript
x = new BigNumber(1);
x.isFinite(); // true
y = new BigNumber(Infinity);
y.isFinite(); // false
注意:如果 n <= Number.MAX_VALUE,可以使用原生方法 isFinite ()。
isGreaterThan.gt(n [, base]) ⇒ boolean
-
n
:数字、字符串或 BigNumber
-
base
:数字
如果此 BigNumber 的值大于 n 的值,则返回 true,否则返回 false。
注意:此方法内部使用 comparedTo 方法。
javascript
0.1 > (0.3 - 0.2); // true
x = new BigNumber(0.1);
x.isGreaterThan(BigNumber(0.3).minus(0.2)); // false
BigNumber(0).gt(x); // false
BigNumber(11, 3).gt(11.1, 2); // true
isGreaterThanOrEqualTo.gte(n [, base]) ⇒ boolean
-
n
:数字、字符串或 BigNumber
-
base
:数字
如果此 BigNumber 的值大于或等于 n 的值,则返回 true,否则返回 false。
注意:此方法内部使用 comparedTo 方法。
javascript
(0.3 - 0.2) >= 0.1; // false
x = new BigNumber(0.3).minus(0.2);
x.isGreaterThanOrEqualTo(0.1); // true
BigNumber(1).gte(x); // true
BigNumber(10, 18).gte('i', 36); // true
isInteger.isInteger() ⇒ boolean
如果该 BigNumber 的值是整数,则返回 true,否则返回 false。
javascript
x = new BigNumber(1);
x.isInteger(); // true
y = new BigNumber(123.456);
y.isInteger(); // false
isLessThan.lt(n [, base]) ⇒ boolean
-
n
:数字、字符串或 BigNumber
-
base
:数字
如果此 BigNumber 的值小于 n 的值,则返回 true,否则返回 false。
注意:此方法内部使用 comparedTo 方法。
javascript
(0.3 - 0.2) < 0.1; // true
x = new BigNumber(0.3).minus(0.2);
x.isLessThan(0.1); // false
BigNumber(0).lt(x); // true
BigNumber(11.1, 2).lt(11, 3); // true
isLessThanOrEqualTo.lte(n [, base]) ⇒ boolean
-
n
:数字、字符串或 BigNumber
-
base
:数字
如果此 BigNumber 的值小于或等于 n 的值,则返回 true,否则返回 false。
注意:此方法内部使用 comparedTo 方法。
javascript
0.1 <= (0.3 - 0.2); // false
x = new BigNumber(0.1);
x.isLessThanOrEqualTo(BigNumber(0.3).minus(0.2)); // true
BigNumber(-1).lte(x); // true
BigNumber(10, 18).lte('i', 36); // true
isNaN.isNaN() ⇒ boolean
如果该 BigNumber 的值是 NaN,则返回 true,否则返回 false。
javascript
x = new BigNumber(NaN);
x.isNaN(); // true
y = new BigNumber('Infinity');
y.isNaN(); // false

注意:也可以使用原生方法 isNaN ()。
isNegative.isNegative() ⇒ boolean
如果该 BigNumber 的符号为负,则返回 true,否则返回 false。
javascript
x = new BigNumber(-0);
x.isNegative(); // true
y = new BigNumber(2);
y.isNegative(); // false
注意:如果 n <= -Number.MIN_VALUE,可以使用 n < 0。
isPositive.isPositive() ⇒ boolean
如果该 BigNumber 的符号为正,则返回 true,否则返回 false。
javascript
x = new BigNumber(-0);
x.isPositive(); // false
y = new BigNumber(2);
y.isPositive(); // true
isZero.isZero() ⇒ boolean
如果该 BigNumber 的值为零或负零,则返回 true,否则返回 false。
javascript
x = new BigNumber(-0);
x.isZero() && x.isNegative(); // true
y = new BigNumber(Infinity);
y.isZero(); // false
注意:如果 n >= Number.MIN_VALUE,可以使用 n == 0。
minus.minus(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值减去 n 的 BigNumber。
返回值始终精确且未舍入。
javascript
0.3 - 0.1; // 0.19999999999999998
x = new BigNumber(0.3);
x.minus(0.1); // '0.2'
x.minus(0.6, 20); // '0'
modulo.mod(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值模 n 的 BigNumber,即该 BigNumber 除以 n 的整数余数。
返回值的符号取决于此 BigNumber 构造函数的 MODULO_MODE 设置。如果为 1(默认值),结果将与该 BigNumber 具有相同的符号,并且将与 Javascript 的 % 运算符(在双精度限制内)和 BigDecimal 的 remainder 方法匹配。
返回值始终精确且未舍入。
javascript
1 % 0.9; // 0.09999999999999998
x = new BigNumber(1);
x.modulo(0.9); // '0.1'
y = new BigNumber(33);
y.mod('a', 33); // '3'
multipliedBy.times(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值乘以 n 的 BigNumber。
返回值始终精确且未舍入。
javascript
0.6 * 3; // 1.7999999999999998
x = new BigNumber(0.6);
y = x.multipliedBy(3); // '1.8'
BigNumber('7e+500').times(y); // '1.26e+501'
x.multipliedBy('-a', 16); // '-6'
negated.negated() ⇒ BigNumber
返回值为该 BigNumber 的值取反的 BigNumber,即乘以 -1。
javascript
x = new BigNumber(1.8);
x.negated(); // '-1.8'
y = new BigNumber(-1.3);
y.negated(); // '1.3'
plus.plus(n [, base]) ⇒ BigNumber
-
n
:数字、字符串或 BigNumber
-
base
:数字
返回值为该 BigNumber 的值加上 n 的 BigNumber。
返回值始终精确且未舍入。
javascript
0.1 + 0.2; // 0.30000000000000004
x = new BigNumber(0.1);
y = x.plus(0.2); // '0.3'
BigNumber(0.7).plus(x).plus(y); // '1.1'
x.plus('0.1', 8); // '0.225'
precision.sd([d [, rm]]) ⇒ BigNumber|number
如果 d 是数字,返回值为该 BigNumber 的值使用舍入模式 rm 舍入到 d 位有效数字的 BigNumber。
如果省略 d 或 d 为 null 或 undefined,返回值为该 BigNumber 值的有效数字位数,或者如果该 BigNumber 的值为 ±Infinity 或 NaN,则为 null。
如果 d 为 true,则数字整数部分的任何 trailing zeros 都计为有效数字,否则不计。
如果省略 rm 或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 d 或 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(9876.54321);
x.precision(6); // '9876.54'
x.sd(); // 9
x.precision(6, BigNumber.ROUND_UP); // '9876.55'
x.sd(2); // '9900'
x.precision(2, 1); // '9800'
x; // '9876.54321'
y = new BigNumber(987000);
y.precision(); // 3
y.sd(true); // 6
shiftedBy.shiftedBy(n) ⇒ BigNumber
返回值为该 BigNumber 的值移动 n 位的 BigNumber。
移动的是小数点,即 10 的幂,如果 n 为负则向左移动,如果 n 为正则向右移动。
返回值始终精确且未舍入。
如果 n 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(1.23);
x.shiftedBy(3); // '1230'
x.shiftedBy(-3); // '0.00123'
squareRoot.sqrt() ⇒ BigNumber
返回值为该 BigNumber 的值的平方根的 BigNumber,根据当前 DECIMAL_PLACES 和 ROUNDING_MODE 设置进行舍入。
返回值将正确舍入,即好像结果首先计算到无限数量的正确数字,然后再舍入。
javascript
x = new BigNumber(16);
x.squareRoot(); // '4'
y = new BigNumber(3);
y.sqrt(); // '1.73205080756887729353'
toExponential.toExponential([dp [, rm]]) ⇒ string
-
dp
:数字,整数,范围在 0 到 1e+9 之间
-
rm
:数字,整数,范围在 0 到 8 之间
返回表示该 BigNumber 的值的字符串,采用指数表示法,使用舍入模式 rm 舍入到 dp 位小数,即小数点前有一位数字,后面有 dp 位数字。
如果该 BigNumber 的指数表示法的值的小数位数少于 dp,则返回值将相应地附加零。
如果省略 dp 或 dp 为 null 或 undefined,小数点后的位数默认为精确表示该值所需的最小位数。
如果省略 rm 或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 dp 或 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = 45.6;
y = new BigNumber(x);
x.toExponential(); // '4.56e+1'
y.toExponential(); // '4.56e+1'
x.toExponential(0); // '5e+1'
y.toExponential(0); // '5e+1'
x.toExponential(1); // '4.6e+1'
y.toExponential(1); // '4.6e+1'
y.toExponential(1, 1); // '4.5e+1' (ROUND_DOWN)
x.toExponential(3); // '4.560e+1'
y.toExponential(3); // '4.560e+1'
toFixed.toFixed([dp [, rm]]) ⇒ string
-
dp
:数字,整数,范围在 0 到 1e+9 之间
-
rm
:数字,整数,范围在 0 到 8 之间
返回表示该 BigNumber 的值的字符串,采用普通(定点)表示法,使用舍入模式 rm 舍入到 dp 位小数。
如果该 BigNumber 的普通表示法的值的小数位数少于 dp,则返回值将相应地附加零。
与 Number.prototype.toFixed 不同,Number.prototype.toFixed 在数字大于或等于 10^21 时返回指数表示法,而此方法始终返回普通表示法。
如果省略 dp 或 dp 为 null 或 undefined,返回值将未舍入并采用普通表示法。这也与 Number.prototype.toFixed 不同,Number.prototype.toFixed 返回值到零位小数。
当需要定点表示法且当前 EXPONENTIAL_AT 设置导致 toString 返回指数表示法时,此方法很有用。
如果省略 rm 或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 dp 或 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = 3.456;
y = new BigNumber(x);
x.toFixed(); // '3'
y.toFixed(); // '3.456'
y.toFixed(0); // '3'
x.toFixed(2); // '3.46'
y.toFixed(2); // '3.46'
y.toFixed(2, 1); // '3.45' (ROUND_DOWN)
x.toFixed(5); // '3.45600'
y.toFixed(5); // '3.45600'
toFormat.toFormat([dp [, rm[, format]]]) ⇒ string
-
dp
:数字,整数,范围在 0 到 1e+9 之间
-
rm
:数字,整数,范围在 0 到 8 之间
-
format
:对象,见 FORMAT
返回表示该 BigNumber 的值的字符串,采用普通(定点)表示法,使用舍入模式 rm 舍入到 dp 位小数,并根据 format 对象的属性进行格式化。
有关 format 对象的属性、类型和用法,请参阅 FORMAT 和下面的示例。格式化对象可以包含一些或所有识别的属性。
如果省略 dp 或 dp 为 null 或 undefined,则返回值不会舍入到固定的小数位数。
如果省略 rm 或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果省略 format 或 format 为 null 或 undefined,使用 FORMAT 对象。
如果 dp、rm 或 format 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
fmt = {
prefix: '',
decimalSeparator: '.',
groupSeparator: ',',
groupSize: 3,
secondaryGroupSize: 0,
fractionGroupSeparator: ' ',
fractionGroupSize: 0,
suffix: ''
};
x = new BigNumber('123456789.123456789');
// 设置全局格式化选项
BigNumber.config({ FORMAT: fmt });
x.toFormat(); // '123,456,789.123456789'
x.toFormat(3); // '123,456,789.123'
// 如果保留了分配给 FORMAT 的对象的引用,
// 可以直接更改格式属性
fmt.groupSeparator = ' ';
fmt.fractionGroupSize = 5;
x.toFormat(); // '123 456 789.12345 6789'
// 或者,将格式化选项作为参数传递
fmt = {
prefix: '=> ',
decimalSeparator: ',',
groupSeparator: '.',
groupSize: 3,
secondaryGroupSize: 2
};
x.toFormat(); // '123 456 789.12345 6789'
x.toFormat(fmt); // '=> 12.34.56.789,123456789'
x.toFormat(2, fmt); // '=> 12.34.56.789,12'
x.toFormat(3, BigNumber.ROUND_UP, fmt); // '=> 12.34.56.789,124'
toFraction.toFraction([maximum_denominator]) ⇒ [BigNumber, BigNumber]
返回一个包含两个 BigNumber 的数组,表示该 BigNumber 的值为一个简单分数,具有整数分子和整数分母。分母将是一个正的非零值,小于或等于 maximum_denominator。
如果未指定 maximum_denominator,或为 null 或 undefined,分母将是精确表示该数字所需的最小值。
如果 maximum_denominator 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(1.75);
x.toFraction(); // '7, 4'
pi = new BigNumber('3.14159265358');
pi.toFraction(); // '157079632679,50000000000'
pi.toFraction(100000); // '312689, 99532'
pi.toFraction(10000); // '355, 113'
pi.toFraction(100); // '311, 99'
pi.toFraction(10); // '22, 7'
pi.toFraction(1); // '3, 1'
toJSON.toJSON() ⇒ string
与 valueOf 相同。
javascript
x = new BigNumber('177.7e+457');
y = new BigNumber(235.4325);
z = new BigNumber('0.0098074');
// 序列化包含三个 BigNumber 的数组
str = JSON.stringify( [x, y, z] );
// "["1.777e+459","235.4325","0.0098074"]"
// 返回包含三个 BigNumber 的数组
JSON.parse(str, function (key, val) {
return key === '' ? val : new BigNumber(val)
});
toNumber.toNumber() ⇒ number
返回该 BigNumber 的值作为 JavaScript 数字原语。
此方法与使用一元加号运算符进行类型转换相同。
javascript
x = new BigNumber(456.789);
x.toNumber(); // 456.789
+x; // 456.789
y = new BigNumber('45987349857634085409857349856430985');
y.toNumber(); // 4.598734985763409e+34
z = new BigNumber(-0);
1 / z.toNumber(); // -Infinity
1 / +z; // -Infinity
toPrecision.toPrecision([sd [, rm]]) ⇒ string
-
sd
:数字,整数,范围在 1 到 1e+9 之间
-
rm
:数字,整数,范围在 0 到 8 之间
返回表示该 BigNumber 的值的字符串,使用舍入模式 rm 舍入到 sd 位有效数字。
如果 sd 小于以普通(定点)表示法表示该值的整数部分所需的位数,则使用指数表示法。
如果省略 sd 或 sd 为 null 或 undefined,返回值与 n.toString () 相同。
如果省略 rm 或 rm 为 null 或 undefined,使用 ROUNDING_MODE。
如果 sd 或 rm 无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = 45.6;
y = new BigNumber(x);
x.toPrecision(); // '45.6'
y.toPrecision(); // '45.6'
x.toPrecision(1); // '5e+1'
y.toPrecision(1); // '5e+1'
y.toPrecision(2, 0); // '4.6e+1' (ROUND_UP)
y.toPrecision(2, 1); // '4.5e+1' (ROUND_DOWN)
x.toPrecision(5); // '45.600'
y.toPrecision(5); // '45.600'
toString.toString([base]) ⇒ string
返回表示该 BigNumber 的值的字符串,采用指定的基数,或者如果省略 base 或 base 为 null 或 undefined,则为十进制。
对于基数大于 10 的情况,使用默认的基数转换字母表(见 ALPHABET),值 10 到 35 用 a-z 表示(与 Number.prototype.toString 相同)。
如果指定了基数,值将根据当前的 DECIMAL_PLACES 和 ROUNDING_MODE 设置进行舍入。
如果未指定基数,并且此 BigNumber 的正指数等于或大于当前 EXPONENTIAL_AT 设置的正分量,或者负指数等于或小于设置的负分量,则返回指数表示法。
如果 base 为 null 或 undefined,则忽略它。
如果基数无效,则抛出错误。有关错误信息,请参阅 “错误” 部分。
javascript
x = new BigNumber(750000);
x.toString(); // '750000'
BigNumber.config({ EXPONENTIAL_AT: 5 });
x.toString(); // '7.5e+5'
y = new BigNumber(362.875);
y.toString(2); // '101101010.111'
y.toString(9); // '442.77777777777777777778'
y.toString(32); // 'ba.s'
BigNumber.config({ DECIMAL_PLACES: 4 });
z = new BigNumber('1.23456789');
z.toString(); // '1.23456789'
z.toString(10); // '1.2346'
valueOf.valueOf() ⇒ string
与 toString 相同,但不接受基数参数,并且为负零包含负号。
javascript
x = new BigNumber('-0');
x.toString(); // '0'
x.valueOf(); // '-0'
y = new BigNumber('1.777e+457');
y.valueOf(); // '1.777e+457'
属性
BigNumber 实例的属性
属性 |
描述 |
类型 |
值 |
c |
系数 * |
number[] |
基数 1e14 的数字数组 |
e |
指数 |
number |
整数,范围在 - 1000000000 到 1000000000 之间 |
s |
符号 |
number |
-1 或 1 |
c、e 和 s 属性中的任何一个的值也可能为 null。
最好将上述属性视为只读属性。在该库的早期版本中,通过直接写入指数属性来更改 BigNumber 的指数是可以的,但现在这不再可靠,因为系数数组的第一个元素的值现在取决于指数。
请注意,与 JavaScript 数字一样,原始指数和小数 trailing zeros 不一定保留。
javascript
x = new BigNumber(0.123); // '0.123'
x.toExponential(); // '1.23e-1'
x.c; // '1,2,3'
x.e; // -1
x.s; // 1
y = new Number(-123.4567000e+2); // '-12345.67'
y.toExponential(); // '-1.234567e+4'
z = new BigNumber('-123.4567000e+2'); // '-12345.67'
z.toExponential(); // '-1.234567e+4'
z.c; // '1,2,3,4,5,6,7'
z.e; // 4
z.s; // -1
零、NaN 和 Infinity
下表显示了 ±0、NaN 和 ±Infinity 的存储方式。
c |
e |
s |
|
±0 |
[0] |
0 |
±1 |
NaN |
null |
null |
null |
±Infinity |
null |
null |
±1 |
javascript
x = new Number(-0); // 0
1 / x == -Infinity; // true
y = new BigNumber(-0); // '0'
y.c; // '0' ( [0].toString() )
y.e; // 0
y.s; // -1
错误
下表显示了抛出的错误。
这些错误是通用的 Error 对象,其消息以 “[BigNumber Error]” 开头。
方法 |
抛出错误 |
BigNumber comparedTo dividedBy dividedToIntegerBy isEqualTo isGreaterThan isGreaterThanOrEqualTo isLessThan isLessThanOrEqualTo minus modulo plus multipliedBy |
基数不是原始数字 基数不是整数 基数超出范围 数字原语有效数字超过 15 位 * 不是基数... 数字 * 不是数字 * |
clone |
需要对象 |
config |
需要对象 DECIMAL_PLACES 不是原始数字 DECIMAL_PLACES 不是整数 DECIMAL_PLACES 超出范围 ROUNDING_MODE 不是原始数字 ROUNDING_MODE 不是整数 ROUNDING_MODE 超出范围 EXPONENTIAL_AT 不是原始数字 EXPONENTIAL_AT 不是整数 EXPONENTIAL_AT 超出范围 RANGE 不是原始数字 RANGE 不是整数 RANGE 不能为零 RANGE 不能为零 CRYPTO 不是 true 或 false crypto 不可用 MODULO_MODE 不是原始数字 MODULO_MODE 不是整数 MODULO_MODE 超出范围 POW_PRECISION 不是原始数字 POW_PRECISION 不是整数 POW_PRECISION 超出范围 FORMAT 不是对象 ALPHABET 无效 |
decimalPlaces precision random shiftedBy toExponential toFixed toFormat toPrecision |
参数不是原始数字 参数不是整数 参数超出范围 |
decimalPlaces precision |
参数不是 true 或 false |
exponentiatedBy |
参数不是整数 |
isBigNumber |
无效的 BigNumber* |
minimum maximum |
不是数字 * |
random |
crypto 不可用 |
toFormat |
参数不是对象 |
toFraction |
参数不是整数 参数超出范围 |
toString |
基数不是原始数字 基数不是整数 基数超出范围 |
要确定异常是否为 BigNumber 错误:
javascript
try {
// ...
} catch (e) {
if (e instanceof Error && e.message.indexOf('[BigNumber Error]') === 0) {
// ...
}
}
类型转换
为了防止在原始数字操作中意外使用 BigNumber,或意外将 BigNumber 添加到字符串,valueOf 方法可以安全地覆盖,如下所示。
valueOf 方法与 toJSON 方法相同,两者都与 toString 方法相同,除了它们不接受基数参数,并且为负零包含负号。
javascript
BigNumber.prototype.valueOf = function () {
throw Error('valueOf called!');
};
x = new BigNumber(1);
x / 2; // '[BigNumber Error] valueOf called!'
x + 'abc'; // '[BigNumber Error] valueOf called!'
常见问题
为什么 BigNumbers 会删除小数 trailing zeros?
一些任意精度库保留小数 trailing zeros,因为它们可以指示值的精度。这可能有用,但算术运算的结果可能会产生误导。
javascript
x = new BigDecimal("1.0");
y = new BigDecimal("1.1000");
z = x.add(y); // 2.1000
x = new BigDecimal("1.20");
y = new BigDecimal("3.45000");
z = x.multiply(y); // 4.1400000

指定值的精度是指指定该值位于某个范围内。
在第一个示例中,x 的值为 1.0。trailing zero 显示了值的精度,暗示它在 0.95 到 1.05 的范围内。同样,y 的 trailing zeros 指示的值的精度表明该值在 1.09995 到 1.10005 的范围内。
如果我们将范围内的两个最小值相加,0.95 + 1.09995 = 2.04995,如果我们将两个最大值相加,1.05 + 1.10005 = 2.15005,因此加法结果的范围(由操作数的精度暗示)为 2.04995 到 2.15005。
然而,BigDecimal 给出的结果 2.1000 表明该值在 2.09995 到 2.10005 的范围内,因此其 trailing zeros 暗示的精度可能会产生误导。
在第二个示例中,真实范围是 4.122744 到 4.157256,而 BigDecimal 的答案 4.1400000 表明范围是 4.13999995 到 4.14000005。同样,trailing zeros 暗示的精度可能会产生误导。
该库与二进制浮点数和大多数计算器一样,不保留小数 trailing zeros。相反,toExponential、toFixed 和 toPrecision 方法允许在需要时添加 trailing zeros。
性能注意事项
在处理极大指数或高精度计算时,BigNumber 的性能可能会受到影响:
-
幂运算(exponentiatedBy) :当指数较大时,计算量会呈指数级增长。例如,
123.456^10000
可能产生超过 50000 位的结果,此时建议通过 POW_PRECISION
限制有效数字位数。
-
大量小数位运算:设置过高的
DECIMAL_PLACES
会增加计算开销,建议根据实际需求调整(默认值为 20)。
-
连续链式操作:虽然 BigNumber 是不可变对象,但频繁创建新实例可能影响性能,建议复用变量。
与其他库的兼容性
-
JSON 序列化:通过重写
toJSON
方法,BigNumber 可直接被 JSON.stringify
序列化,反序列化时需手动转换(如示例所示)。
-
原生数字转换:使用
toNumber()
可将 BigNumber 转换为 JavaScript 原生数字,但需注意精度丢失(超过 15 位有效数字时)。
-
浏览器与 Node.js 环境:在 Node.js 中需手动引入
crypto
模块以启用加密安全随机数(CRYPTO: true
)。
最佳实践
-
初始化优化:
- 优先使用字符串初始化大数字(如
new BigNumber('12345678901234567890')
),避免数字原语精度丢失。
- 对于固定精度场景,提前通过
config
设置 DECIMAL_PLACES
和 ROUNDING_MODE
。
-
舍入模式选择:
- 金融计算推荐使用
ROUND_HALF_EVEN
(IEEE 754 标准),避免累计误差。
- 科学计算可根据需求选择
ROUND_UP
或 ROUND_FLOOR
。
-
性能优化技巧:
- 使用
clone()
创建独立配置的构造函数,避免全局配置污染。
- 对重复计算的中间结果进行缓存(如
const half = new BigNumber(0.5)
)。
-
错误处理:
- 生产环境建议关闭
DEBUG
模式以提高性能,开发阶段可启用以捕获潜在问题。
- 通过
try-catch
捕获 [BigNumber Error]
类型错误,进行友好提示。
常见场景示例
金融计算(精确除法)
javascript
// 计算 1/3 并保留 10 位小数
const config = { DECIMAL_PLACES: 10, ROUNDING_MODE: BigNumber.ROUND_HALF_EVEN };
const oneThird = new BigNumber(1).dividedBy(3, 10).set(config);
console.log(oneThird.toFixed()); // '0.3333333333'
加密安全随机数
javascript
// Node.js 环境
global.crypto = require('crypto');
BigNumber.config({ CRYPTO: true, DECIMAL_PLACES: 16 });
const randomNum = BigNumber.random();
console.log(randomNum); // 如 '0.7819332763691409'(加密安全)
大数比较与排序
javascript
const numbers = [
'9999999999999999999',
new BigNumber('1e20'),
99999999999999999999
];
const sorted = numbers.sort((a, b) =>
new BigNumber(a).comparedTo(new BigNumber(b))
);
console.log(sorted); // ['9999999999999999999', 99999999999999999999, '1e20']
货币格式化
javascript
BigNumber.config({
FORMAT: {
prefix: '¥',
decimalSeparator: '.',
groupSeparator: ',',
groupSize: 3,
suffix: '元'
}
});
const price = new BigNumber('1234567.89');
console.log(price.toFormat()); // '¥1,234,567.89元'
版本兼容性
-
ES5 与 ES6+ :库本身不依赖 ES6 特性,可在传统浏览器中使用。
-
模块化支持:支持 CommonJS(Node.js)和 AMD 规范,也可通过全局变量
BigNumber
访问。
扩展与自定义
-
自定义基数字母表:
javascript
// 自定义十六进制字母表(含大写字母)
BigNumber.config({ ALPHABET: '0123456789ABCDEF' });
const hexNum = new BigNumber('FF', 16);
console.log(hexNum.toString()); // '255'
-
添加自定义方法:
javascript
// 扩展原型添加百分比计算方法
BigNumber.prototype.percentOf = function(percent) {
return this.multipliedBy(percent).dividedBy(100);
};
const total = new BigNumber(200);
const discount = total.percentOf(15); // 计算 15% 折扣
console.log(discount); // '30'
疑难解答
-
为什么 0.1 + 0.2 不等于 0.3?
-
如何处理超出 JavaScript 数字范围的数?
- 答:直接使用字符串初始化,如
new BigNumber('1e1000')
,BigNumber 会自动处理指数范围(受 RANGE
配置限制)。
-
基数转换时如何处理大数?
-
答:BigNumber 支持最大 36 进制(默认字母表),如需更高基数可扩展 ALPHABET
,如:
javascript
BigNumber.config({ ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' });
const base62Num = new BigNumber('123456', 62);
console.log(base62Num.toString()); // '279838'

贡献与反馈
-
问题报告:请在 GitHub 仓库 提交 Issue,附详细复现步骤。
-
功能请求:通过 Pull Request 贡献代码,需遵循项目测试规范。
-
社区支持:可通过 Stack Overflow 标签
#bignumber.js
获得帮助。
许可证
bignumber.js 遵循 MIT 许可证,允许自由使用、修改和分发。