当前位置: 首页 > news >正文

JavaScript 中的 BigInt:当普通数字不够“大“时的救星

前言

大家好!今天我们要聊一聊 JavaScript 中那个"大"到不行的数据类型 —— BigInt。如果你曾经因为 JavaScript 的数字精度问题而抓狂,或者好奇为什么 9007199254740992 === 9007199254740993 会返回 true,那么这篇文章就是为你准备的!

为什么我们需要 BigInt?

JavaScript 中的 Number 类型使用 IEEE 754 双精度浮点数表示,这意味着它能安全表示的最大整数是 2^53 - 1(即 9007199254740991)。超过这个数字,事情就开始变得…奇怪。

console.log(9007199254740991) // 正常
console.log(9007199254740992) // 看起来也正常
console.log(9007199254740993) // 等等,这不科学!
// 输出: 9007199254740992console.log(9007199254740992 === 9007199254740993) 
// 输出: true 😱

看到没?JavaScript 在背后偷偷把你的大数字四舍五入了!这就是所谓的"精度丢失"问题。

BigInt 来拯救世界!

ES2020 引入了 BigInt 类型,专门用来表示任意精度的整数。有了它,你再也不用担心数字太大而"失真"了。

创建 BigInt

有两种方式创建 BigInt:

  1. 在数字后面加个 n

    const bigNumber = 9007199254740993n;
    console.log(bigNumber); // 9007199254740993n
    
  2. 使用 BigInt() 函数

    const sameBigNumber = BigInt("9007199254740993");
    console.log(sameBigNumber); // 9007199254740993n
    

注意:

  1. BigInt是一个函数,它不能通过new BigInt来创建
  2. 通过BigInt("123456789123456789")这种方式创建,里面的传入的数据要是Boolean类型(也就是要加双引号,或者本身就是一个布尔类型),不然你传进去的数据已经精度丢失了

BigInt 的基本运算

BigInt 可以像普通数字一样进行运算,只是要注意几点:

const a = 123456789012345678901234567890n;
const b = 987654321098765432109876543210n;// 加法
console.log(a + b); // 1111111110111111111011111111100n// 减法
console.log(b - a); // 864197532086419753208641975320n// 乘法
console.log(a * b); // 121932631137021795226185032733622923332237463801111263526900n// 除法 (会向下取整)
console.log(b / a); // 8n

注意事项:BigInt 的"怪癖"

  1. 不能和 Number 直接混用

    console.log(1n + 2); // TypeError: Cannot mix BigInt and other types
    

    你必须先转换类型:

    console.log(1n + BigInt(2)); // 3n
    
  2. 没有小数部分
    BigInt 就是"大整数",所以:

    console.log(5n / 2n); // 2n,不是 2.5
    
  3. 比较运算符可以混用

    console.log(1n < 2); // true
    console.log(2n === 2); // false (类型不同)
    console.log(2n == 2); // true (值相同)
    
  4. 不能使用 Math 对象的方法

    console.log(Math.sqrt(16n)); // TypeError
    

实际应用场景

  1. 处理大整数 ID
    当你的数据库 ID 超过了 JavaScript 的安全整数范围时,BigInt 就派上用场了。
  2. 加密算法
    许多加密算法需要处理非常大的数字。
  3. 高精度计算
    金融计算、科学计算等需要精确整数运算的场景。

性能考虑

BigInt 的运算比普通 Number 要慢,所以除非真的需要,否则不要滥用。就像你不会用卡车去买菜一样(除非你要买的菜真的很多)。

有趣的 BigInt 技巧

使用 BigInt 计算斐波那契数列

function fibonacci(n) {let a = 0n, b = 1n;for (let i = 0n; i < n; i++) {[a, b] = [b, a + b];}return a;
}console.log(fibonacci(100n));
// 输出: 354224848179261915075n

使用 BigInt 进行位运算

const x = 0b1100110011001100110011001100110011001100110011001100110011001100n;
console.log(x >> 32n); // 右移32位

总结

BigInt 是 JavaScript 中处理大整数的终极解决方案。它就像数字类型的"加长版豪华轿车"——当你需要额外的空间时,它就在那里等着你。记住:

  • 大数字后面加 n 或使用 BigInt() 函数
  • 不能和 Number 直接混用
  • 没有小数部分
  • 比普通 Number 运算慢

现在,去征服那些庞大的数字吧!记住:能力越大,责任越大(特别是当你的数字真的很大的时候)!


希望这篇略带幽默的技术博客能满足你的需求!BigInt 虽然看起来简单,但在实际应用中还是有很多需要注意的细节。如果你有任何问题或需要进一步的解释,随时告诉我!

相关文章:

  • #Js篇:两个前端应用通过postMessage传递file对像 URL.createObjectURL+fetch
  • Blaster - Multiplayer P117-PXXX: 匹配状态
  • 怒更一波免费声音克隆和AI配音功能
  • qlora
  • MTK平台-- 如何在屏幕关闭时过滤组播和广播的数据包
  • Java开发经验——阿里巴巴编码规范实践解析7
  • 【stm32开发板】原理图设计(电源部分)附:设计PCB流程
  • sql查询中in不生效的问题
  • 【SQL Server Management Studio 连接时遇到的一个错误】
  • 额度年审领域知识讲解
  • 中间表/中转表笔记
  • ⚽【足球数据全维度解析】从基础统计到高阶分析,数据如何重塑现代足球?
  • 用 Python 模拟下雨效果
  • [智能算法]蚁群算法原理与TSP问题示例
  • 软考-系统架构设计师-第二章 嵌入式基础知识
  • 计算机总线技术深度解析:从系统架构到前沿演进
  • 软考-系统架构设计师-第七章 软件工程基础知识
  • MySQL 8.0中的mysql.ibd文件
  • 6个月Python学习计划 Day 8 - Python 函数基础
  • PCIe走线注意事项
  • 做网站的工具怎么使用/产品推广
  • 网站建设中高低端区别/seo快速排名百度首页
  • 网站搜索算法/深圳网站建设推广优化公司
  • app与移动网站开发资料/站长统计app软件下载官网
  • 建设公司营销网站/今日新闻头条新闻
  • 网站锚点/常用网站推广方法及资源