JavaScript 中 BigInt 如何转换为 Number

作者:袖梨 2026-07-14
BigInt 不能直接安全转换为 Number,因 Number 精度限制(最大安全整数为 2⁵³−1),超范围转换会丢失精度;仅当 BigInt 在 ±(2⁵³−1) 内才可用 Number() 安全转换,否则需先校验范围或报错。

BigInt 不能直接安全转换为 Number,因为 Number 类型有精度限制(最大安全整数为 253 − 1),而 BigInt 可表示任意大的整数。强行转换可能导致精度丢失甚至抛出错误。

1. 使用 Number() 转换(仅适用于小 BigInt)

当 BigInt 的值在 -(2<sup>53</sup> - 1)2<sup>53</sup> - 1 范围内时,可调用 Number(bigInt) 得到对应数值:

  • Number(123n)123
  • Number(-456n)-456
  • Number(9007199254740991n)9007199254740991(刚好是 MAX_SAFE_INTEGER

超出该范围会丢失精度:Number(9007199254740992n) 也返回 9007199254740992,但 Number(9007199254740993n) 返回 9007199254740992(已不准确)。

2. 使用 parseInt()parseFloat()

它们内部会先将 BigInt 转为字符串再解析,行为与 Number() 基本一致,同样不解决大数精度问题:

立即学习“Java免费学习笔记(深入)”;

  • parseInt(123n)123
  • parseFloat("3.14n") 不适用(BigInt 字面量不含小数点,不能直接传入)

注意:parseInt(9007199254740993n) 同样返回 9007199254740992,不可靠。

3. 安全检查后再转换

若业务需要确保不丢失精度,应先判断 BigInt 是否在安全范围内:

  • bigInt <= Number.MAX_SAFE_INTEGER && bigInt >= Number.MIN_SAFE_INTEGER
  • 满足条件才调用 Number(bigInt),否则报错或降级处理

示例:

function safeBigIntToNumber(bigInt) {  if (bigInt >= -9007199254740991n && bigInt <= 9007199254740991n) {    return Number(bigInt);  }  throw new RangeError('BigInt exceeds Number precision');}

4. 需要浮点数?通常不该转

BigInt 是整数类型,没有小数部分。如果原始数据本就含小数(比如来自 JSON 或用户输入),它本就不该用 BigInt 表示。若硬要模拟“小数 BigInt”,需自行约定缩放倍数(如以微秒、分、毫为单位存整数),转换时再除以对应倍数 —— 但这属于业务逻辑,不是语言层面的转换。

相关文章

精彩推荐