登录
首页 >  文章 >  前端

BigInt与Number转换技巧全解析

时间:2026-04-13 08:54:44 196浏览 收藏

BigInt与Number之间无法自动转换,必须通过Number()和BigInt()进行显式转换,但每种转换都暗藏陷阱:BigInt转Number仅在±2⁵³−1安全范围内无损,超限将导致精度丢失或抛出RangeError;Number转BigInt则严格拒绝小数、NaN和Infinity,小数会被直接截断而非四舍五入,字符串输入反而更安全。二者本质迥异——Number是双精度浮点,BigInt是任意精度整数,因此关键原则是:能不用转换就不用,必须转换时务必先校验范围、避免中间经过Number解析,并优先从原始字符串构造BigInt以守住精度底线。

JavaScript中BigInt与Number进行显式转换的方法

BigInt 与 Number 不能自动互转,必须显式转换,且需注意精度丢失和范围限制。

BigInt 转 Number

使用 Number() 函数可将 BigInt 转为 Number,但仅当值在 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER(即 ±2⁵³−1)范围内才安全。超出时会丢失精度或抛出 RangeError(取决于引擎实现,Chrome 报错,Firefox 返回 Infinity 或错误值)。

  • Number(100n)100
  • Number(9007199254740992n)9007199254740992(刚好是 2⁵³,仍属安全整数边界内)
  • Number(9007199254740993n)9007199254740992(已丢失精度)
  • Number(10n ** 100n) → 在 Chrome 中抛出 RangeError;Firefox 可能返回 Infinity

Number 转 BigInt

使用 BigInt() 构造函数,但只接受**整数值**(小数会被截断),且不能传入 NaNInfinity 或非数字字符串。

  • BigInt(123)123n
  • BigInt(123.9)123n(小数部分直接丢弃,不四舍五入)
  • BigInt(NaN)BigInt(Infinity) → 抛出 TypeError
  • BigInt("123")123n(支持十进制字符串)
  • BigInt("0xFF")255n(也支持十六进制等带前缀的字符串)

安全互转的实用建议

避免隐式混合运算,显式检查再转换:

  • 转 Number 前先用 BigInt.asIntN(64, value) === value 粗略判断是否在安全整数范围内(不够精确,仅作参考)
  • 更可靠的做法:用 value = Number.MIN_SAFE_INTEGER(注意比较时两边都应为 BigInt 或都转 Number)
  • 若需保留大整数精度,尽量全程使用 BigInt,避免转回 Number
  • 从用户输入或 API 获取数字时,优先用 BigInt(String(value)) 而非 BigInt(Number(value)),防止 Number 解析阶段就丢失精度(如超长数字字符串)

不复杂但容易忽略细节,关键在于理解两者的表示本质不同:Number 是双精度浮点,BigInt 是任意精度整数。

以上就是《BigInt与Number转换技巧全解析》的详细内容,更多关于的资料请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>