为何在Chrome、Firefox、Safari中BigInt(2 ** 100)能返回正确结果
为什么传入BigInt的数值没提前溢出且结果正确?2的其他次幂能否依赖该行为?
原因分析
你的结果正确,核心是没有触发Number类型的精度丢失/溢出,常见场景有两种:
- 用字符串字面量创建BigInt:当你传入字符串形式的数值(比如
BigInt("18446744073709551616")),JS引擎会直接解析字符串中的十进制整数,不会先转换为Number类型。而Number的精度限制(仅能精确表示2^53-1以内的整数)对你的操作完全没有影响,自然能得到准确结果。 - 用BigInt原生运算生成结果:如果你是通过
BigInt(2) ** 64这类方式计算,全程都是BigInt类型的运算。BigInt本身设计就是用来处理任意精度的整数,不存在Number的溢出或精度丢失问题,所以结果准确。
反过来,如果是先通过Number运算得到数值再转BigInt(比如BigInt(2**64)),此时2^64已经超出Number的安全整数范围,数值会失真,转成BigInt后结果也会错误——你没遇到这种情况,说明你没走这条路径。
2的其他次幂能否依赖该行为?
分情况判断:
- 完全可靠的场景:
- 直接传入数值字符串创建BigInt(比如
BigInt("36893488147419103232")表示2^65),只要字符串是合法的十进制整数,不管2的次幂多大,BigInt都能精确解析。 - 使用BigInt类型进行运算生成(比如
BigInt(2) ** n,n为任意整数),BigInt的幂运算本身是高精度的,不会有精度损失,可以放心依赖。
- 直接传入数值字符串创建BigInt(比如
- 绝对不能依赖的场景:
- 先通过Number计算2的次幂(比如
2**n),再将结果转为BigInt。当n>53时,Number无法精确表示该值,转成BigInt后结果必然错误。
- 先通过Number计算2的次幂(比如
示例代码
// 正确用法 console.log(BigInt("18446744073709551616")); // 2^64 → 18446744073709551616n(准确) console.log(BigInt(2) ** 64); // 18446744073709551616n(准确) // 错误用法 console.log(2**64); // 18446744073709552000(Number精度丢失) console.log(BigInt(2**64)); // 18446744073709552000n(错误)
内容的提问来源于stack exchange,提问作者Patman
相关产品推荐
相关产品推荐

