BigInt 不能直接安全转换为 Number,因 Number 精度限制(最大安全整数为 2⁵³−1),超范围转换会丢失精度;仅当 BigInt 在 ±(2⁵³−1) 内才可用 Number() 安全转换,否则需先校验范围或报错。
BigInt 不能直接安全转换为 Number,因为 Number 类型有精度限制(最大安全整数为 253 − 1),而 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(已不准确)。
它们内部会先将 BigInt 转为字符串再解析,行为与 Number() 基本一致,同样不解决大数精度问题:
立即学习“Java免费学习笔记(深入)”;
parseInt(123n) → 123
parseFloat("3.14n") 不适用(BigInt 字面量不含小数点,不能直接传入)注意:parseInt(9007199254740993n) 同样返回 9007199254740992,不可靠。
若业务需要确保不丢失精度,应先判断 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');}
BigInt 是整数类型,没有小数部分。如果原始数据本就含小数(比如来自 JSON 或用户输入),它本就不该用 BigInt 表示。若硬要模拟“小数 BigInt”,需自行约定缩放倍数(如以微秒、分、毫为单位存整数),转换时再除以对应倍数 —— 但这属于业务逻辑,不是语言层面的转换。