javascript中将number转bigint必须显式调用bigint(),仅支持安全整数范围内的整数number值,小数、nan、infinity及超出精度范围的数均会报错,且number与bigint不支持隐式转换。

JavaScript 中将 Number 转为 BigInt 必须显式调用 BigInt() 构造函数,且仅支持安全整数范围内的数值(即 Number 类型能精确表示的整数),超出则会抛出 RangeError。
BigInt() 只接受整数 Number 值
BigInt() 不接受小数、NaN、Infinity 或非数字类型。传入浮点数(如 3.14)会直接报错,即使值是整数形式(如 5.0)也不行——因为其内部类型仍是 "number" 且 Number.isInteger(5.0) 虽为 true,但 BigInt(5.0) 仍会失败。
-
BigInt(42)✅ 成功 →42n -
BigInt(42.0)❌ 报错:TypeError: Cannot convert 42 to a BigInt -
BigInt(3.14)❌ 报错 -
BigInt(NaN)❌ 报错
必须确保 Number 是安全整数
Number 类型能无损表示的整数范围是 -(2^53 - 1) 到 2^53 - 1(即 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER)。超出该范围的整数在转成 Number 时已丢失精度,再用 BigInt() 转换只会固化错误值。
-
BigInt(Number.MAX_SAFE_INTEGER)✅ →9007199254740991n -
BigInt(9007199254740992)✅(虽等于MAX_SAFE_INTEGER + 1,但该值在Number中仍可表示为整数,只是不“安全”)→ 实际得到9007199254740992n,但该Number已无法区分+1和+2,转换本身不报错,但语义可能失真 -
BigInt(2**53 + 1)❌ 实际执行时不会报错,但2**53 + 1在Number中等于2**53(精度丢失),所以BigInt(2**53 + 1)等价于BigInt(9007199254740992),结果不是预期的大数
推荐做法:先校验再转换
为避免意外,应主动检查输入是否为安全整数,并确保它是整数类型。
- 用
Number.isInteger(num)排除非整数 - 用
num = Number.MIN_SAFE_INTEGER确保在安全范围内 - 或直接使用
BigInt(Math.trunc(num))处理带小数的场景(但需明确截断意图) - 字符串转换更稳妥:
BigInt(num.toString())可绕过Number的精度限制,前提是原始值以字符串形式存在(如来自 JSON 或用户输入)
注意隐式转换不存在
Number 和 BigInt 之间不支持自动转换。任何混合运算(如 1n + 2)都会立即抛出 TypeError。也不能用 == 比较(1n == 1 返回 false),必须显式转换后比较(如 Number(1n) === 1 或 1n === BigInt(1))。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











