JavaScript中常规Number类型基于IEEE 754双精度浮点格式存储,安全整数范围仅为-2^53+1到2^53-1,超出该范围的整数会出现精度丢失问题。BigInt类型专门用于表示任意大的整数,能够完美解决大整数运算的精度问题,下面我们来详细了解其实现和运算方法。

BigInt的基本声明与使用
BigInt有两种常见的声明方式,一种是直接在整数后面添加n后缀,另一种是使用BigInt()构造函数进行转换,具体示例如下:
// 字面量方式声明BigInt
const bigNum1 = 123456789012345678901234567890n;
// 构造函数方式声明,参数可以是数字或字符串
const bigNum2 = BigInt(123);
const bigNum3 = BigInt("9007199254740993");
console.log(typeof bigNum1); // 输出 "bigint"
console.log(bigNum1); // 输出 123456789012345678901234567890n
BigInt与普通Number的核心区别
BigInt和Number虽然都用于表示数值,但存在诸多差异,主要区别如下:
- BigInt是整数类型,不能表示小数,而Number可以表示整数和小数
- BigInt没有安全整数范围限制,Number的安全整数范围是
Number.MIN_SAFE_INTEGER到Number.MAX_SAFE_INTEGER - BigInt和Number不能直接混合运算,需要显式转换类型
- BigInt不支持
Math对象下的方法,需要自定义运算逻辑
大整数运算的实现方法
基础算术运算
BigInt支持标准的算术运算符,包括加减乘除和取余,运算规则与Number类似,示例如下:
const a = 1000000000000000000000n; const b = 2000000000000000000000n; // 加法运算 const sum = a + b; // 3000000000000000000000n // 减法运算 const diff = b - a; // 1000000000000000000000n // 乘法运算 const product = a * 3n; // 3000000000000000000000n // 除法运算,结果会自动向下取整,舍弃小数部分 const quotient = b / 3n; // 666666666666666666666n // 取余运算 const remainder = b % 3n; // 2n
比较运算与逻辑判断
BigInt可以和Number进行比较,只要两者数值相等就会返回true,同时BigInt也支持逻辑判断:
const big = 10n; const num = 10; console.log(big == num); // true,宽松相等比较时数值相等即可 console.log(big === num); // false,严格相等比较时类型不同返回false console.log(big > 5n); // true console.log(big < 20); // true,BigInt和Number可以比较大小
手动实现大整数运算(模拟底层逻辑)
如果需要在不支持BigInt的环境下实现大整数运算,可以将大整数拆分为数组,按位进行运算,下面以加法为例:
function addBigInt(str1, str2) {
// 将字符串反转,方便从低位开始计算
let arr1 = str1.split('').reverse();
let arr2 = str2.split('').reverse();
let result = [];
let carry = 0; // 进位值
const maxLen = Math.max(arr1.length, arr2.length);
for (let i = 0; i < maxLen; i++) {
const num1 = parseInt(arr1[i] || 0);
const num2 = parseInt(arr2[i] || 0);
const sum = num1 + num2 + carry;
result.push(sum % 10);
carry = Math.floor(sum / 10);
}
// 处理最后的进位
if (carry > 0) {
result.push(carry);
}
// 反转结果数组并拼接为字符串
return result.reverse().join('');
}
console.log(addBigInt("12345678901234567890", "98765432109876543210"));
// 输出 111111111011111111100
BigInt的使用注意事项
在使用BigInt时需要注意以下几点,避免出现语法错误或逻辑问题:
- BigInt不能使用
new关键字创建,new BigInt()会抛出语法错误 - BigInt和Number混合运算时会抛出
TypeError,需要提前转换类型 - BigInt转换为Number时可能出现精度丢失,尤其是超出Number安全范围的大整数
- JSON序列化不支持BigInt类型,直接序列化会抛出错误,需要自定义序列化逻辑
实战场景示例
下面以金融场景中的大额金额计算为例,演示BigInt的实际使用:
// 金额单位为分,避免小数问题,使用BigInt处理
const orderAmount = BigInt("100000000000000000"); // 1亿金额
const discountRate = 80n; // 8折
const finalAmount = orderAmount * discountRate / 100n;
console.log(`最终支付金额:${finalAmount}分`);
// 输出 最终支付金额:80000000000000000分
BigIntJavaScript大整数运算高精度计算修改时间:2026-06-14 05:03:17