讲师中心 微信公众号
AI工具推荐 视频效率加速

JS如何实现BigInt?大整数的运算

酷枫姑娘_2645

酷枫姑娘_2645

发布时间:2025-08-16 09:07:01

|

1051人浏览过

|

来源于php中文网

原创

JavaScript引入BigInt类型以解决Number类型在处理超过2^53-1的大整数时精度丢失的问题,通过n后缀或BigInt()构造函数创建,支持常规算术与位运算,但不可与Number直接混合运算,需显式转换。BigInt除法向下取整,不支持JSON序列化,建议使用字符串转换处理;推荐在处理大整数ID、加密计算等场景使用,避免精度丢失,提升代码可靠性。

js如何实现bigint?大整数的运算

JavaScript引入了原生的

BigInt
类型,它允许我们直接处理任意精度的整数,解决了传统
Number
类型在表示和计算超过
2^53-1
或小于
-(2^53-1)
的大整数时精度丢失的问题。这意味着,那些曾经需要借助第三方库才能完成的超大数字运算,现在可以被语言本身直接支持了,大大提升了开发效率和代码的简洁性。

解决方案

使用

BigInt
进行大整数运算,核心在于理解它的创建方式和与传统
Number
类型的交互规则。

你可以通过在整数后面添加

n
后缀来创建一个
BigInt
字面量,比如
123n
。或者,使用
BigInt()
构造函数将
Number
类型的值(或字符串)转换为
BigInt
,例如
BigInt(123)
或
BigInt("9007199254740991")
。

const bigNumberLiteral = 9007199254740991n; // 直接使用n后缀
const bigNumberFromNumber = BigInt(9007199254740991); // 从Number转换
const bigNumberFromString = BigInt("900719925474099123456789"); // 从字符串转换,推荐用于超大数字

console.log(bigNumberLiteral); // 9007199254740991n
console.log(bigNumberFromNumber); // 9007199254740991n
console.log(bigNumberFromString); // 900719925474099123456789n

BigInt
支持所有常规的算术运算符:
+
、
-
、
*
、
/
、
%
、
**
(幂)。比较运算符如
==
、
===
、
<
、
>
等也同样适用。需要特别注意的是,
BigInt
和
Number
类型不能直接进行混合运算。例如,
1n + 1
会抛出
TypeError
。如果你需要混合使用,必须显式地进行类型转换。

const a = 10n;
const b = 3n;

console.log(a + b); // 13n
console.log(a - b); // 7n
console.log(a * b); // 30n
console.log(a / b); // 3n (注意:BigInt的除法会向下取整,没有小数部分)
console.log(a % b); // 1n
console.log(a ** b); // 1000n

// 类型转换示例
const num = 5;
// console.log(a + num); // TypeError: Cannot mix BigInt and other types, use explicit conversions
console.log(a + BigInt(num)); // 15n
console.log(Number(a) + num); // 15 (注意:如果BigInt太大,转换为Number可能导致精度丢失)

BigInt
的除法操作会直接截断小数部分,这与
Number
类型不同。比如
5n / 2n
的结果是
2n
,而不是
2.5
。这符合整数除法的语义。此外,
BigInt
也支持位运算符,如
&
、
|
、
^
、
~
、
<<
、
>>
、
>>>
。
typeof
运算符对
BigInt
值返回
"bigint"
。

BigInt与传统Number类型有何不同?为何需要BigInt?

JavaScript的

Number
类型是基于IEEE 754标准的双精度浮点数实现的。这意味着它能精确表示的整数范围是有限的,具体来说,是从
-(2^53 - 1)
到
2^53 - 1
(即
-9007199254740991
到
9007199254740991
)。超过这个范围的整数,
Number
类型就无法精确表示了,会发生精度丢失,导致一些大整数在内存中被“四舍五入”成一个近似值。

我记得以前在处理一些后端返回的ID,或者像区块链、加密货币这类场景的数值时,经常会遇到这种问题。一个看起来很长的数字,一到前端用

Number
一解析,结果就变了,这简直是灾难。

const maxSafeInteger = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(maxSafeInteger + 1); // 9007199254740992
console.log(maxSafeInteger + 2); // 9007199254740992 (这里已经开始丢失精度了!)

BigInt
的出现正是为了解决这个痛点。它不限制整数的位数,只要内存允许,理论上可以表示任意大的整数。这意味着,无论你的数字有多长,
BigInt
都能精确地存储和计算,不会有任何精度问题。这对于需要处理大额资金、加密哈希值、高精度计算或者大型数据库ID等场景来说,简直是雪中送炭。它让JavaScript在处理这些特定领域的问题时,变得更加可靠和强大。

如何在JavaScript中高效地使用BigInt进行大整数运算?

高效使用

BigInt
,除了掌握其基本运算,更重要的是理解其与
Number
类型的交互规范,以及一些潜在的“坑”。

最关键的一点,也是我个人觉得最容易犯错的地方,就是

BigInt
和
Number
不能直接混用。语言设计者这样做的目的很明确:避免隐式的类型转换导致开发者在不知情的情况下丢失精度。如果允许
1n + 1
这种操作,那么结果是
2n
还是
2
?如果结果是
2
,那么
1n
的任意精度优势就没了;如果结果是
2n
,那么
1
这个
Number
就被强制提升了,这也不符合直觉。所以,强制要求显式转换,虽然初次接触会觉得有点麻烦,但从长期来看,它能帮助我们写出更健壮、更不容易出错的代码。

// 错误示范:TypeError
// const result = 5n + 2;

// 正确示范:显式转换
const result1 = 5n + BigInt(2); // 7n
const result2 = Number(5n) + 2; // 7 (注意:这里如果5n的值超出了Number的安全范围,就会丢失精度)

在实际应用中,如果你的数据源(比如从后端API获取的JSON)中包含超出

Number
安全范围的大整数,它们通常会被序列化为字符串。这时,你应该使用
BigInt(string)
来创建
BigInt
,而不是先解析成
Number
再转换,因为那样就已经晚了,精度可能已经丢失。

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载
const largeIdString = "123456789012345678901234567890n"; // 假设这是从API得到的字符串
// const wrongId = Number(largeIdString); // 这会出错或者精度丢失
const correctId = BigInt(largeIdString.slice(0, -1)); // 如果字符串带'n',需要处理一下
// 或者如果后端直接返回纯数字字符串,更直接
const pureNumberString = "123456789012345678901234567890";
const correctId2 = BigInt(pureNumberString);

处理BigInt时常见的陷阱与最佳实践有哪些?

尽管

BigInt
带来了巨大的便利,但在使用过程中确实有一些需要注意的“陷阱”,以及一些可以提升代码质量的最佳实践。

陷阱1:JSON序列化问题

BigInt
类型的值不能直接被
JSON.stringify()
序列化。尝试这样做会抛出
TypeError: Do not know how to serialize a BigInt
。这是因为JSON标准本身没有定义
BigInt
这种数据类型。

const data = {
  id: 12345678901234567890n,
  name: "Test"
};
// JSON.stringify(data); // TypeError

解决方案: 通常的做法是提供一个自定义的

replacer
函数给
JSON.stringify
,将
BigInt
转换为字符串,或者在需要时转换为
Number
(如果确定不会丢失精度)。

const data = {
  id: 12345678901234567890n,
  name: "Test"
};

const jsonString = JSON.stringify(data, (key, value) =>
  typeof value === 'bigint' ? value.toString() : value
);
console.log(jsonString); // {"id":"12345678901234567890","name":"Test"}

在接收端,你可能需要一个

reviver
函数将这些字符串再转换回
BigInt
。

陷阱2:除法结果的截断

前面也提到了,

BigInt
的除法会直接截断小数部分。如果你期望得到一个浮点数结果,你需要进行显式的类型转换,或者在计算前将数字放大。

console.log(7n / 2n); // 3n
// 如果需要浮点数结果
console.log(Number(7n) / Number(2n)); // 3.5

陷阱3:宽松相等(==)与严格相等(===)

BigInt
和
Number
在宽松相等比较时可能表现出你意想不到的行为:
1n == 1
是
true
。但严格相等
1n === 1
是
false
,因为它们的类型不同。在大多数情况下,坚持使用严格相等
===
是更好的实践,这能避免很多潜在的类型转换带来的混淆。

最佳实践:

  • 明确意图: 在代码中,当你看到一个数字后面跟着
    n
    ,你就知道它是一个
    BigInt
    。这比使用一个普通的
    Number
    然后依赖注释来表示它是一个大整数要清晰得多。
  • 避免不必要的转换: 尽量在整个运算链中保持
    BigInt
    类型,直到最后需要与
    Number
    交互(比如显示给用户或者发送给只接受
    Number
    的API)时再进行转换。这样可以最大限度地保留精度。
  • 性能考量:
    BigInt
    运算通常比
    Number
    运算慢,因为它需要处理任意精度的逻辑。对于大多数应用来说,这种性能差异可以忽略不计。但如果你在做大量、高频率的大整数计算,并且对性能有极致要求,那么需要进行性能测试,甚至考虑使用WebAssembly或其他优化方案。不过,这通常是极少数情况,对于日常开发,
    BigInt
    的性能已经足够。
  • 兼容性:
    BigInt
    是相对较新的特性(ES2020),虽然现代浏览器和Node.js都已支持,但如果需要支持老旧环境,可能需要Babel等工具进行转译,或者使用Polyfill(虽然
    BigInt
    的Polyfill通常是通过引入第三方库实现的,这又回到了最初的问题)。

总的来说,

BigInt
的引入是JavaScript语言在处理数字方面的一个重要里程碑,它让开发者能够更自信、更直接地处理那些曾经令人头疼的超大数字。理解它的特性、规避其陷阱,就能让你的代码在处理复杂数值计算时如虎添翼。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2115

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3222

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1096

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3679

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2931

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

534

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

502

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6299

2023.08.02

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 常见问题
phpMyAdmin 常见问题

共0课时 | 0人学习

uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn