javascript 中大于 number.max_safe_integer(即 2^53 - 1)的整数在直接转为字符串时确实会丢失精度,因为 javascript 使用 ieee 754 双精度浮点数存储数字,无法精确表示超过该范围的整数。要解决这个问题,可以使用 bigint 类型,它支持任意精度的整数运算和转换,或者使用专门的库如 bignumber.js 来处理大数。

Number 类型在大数转换时的精度表现
当使用 String() 或 .toString() 方法处理超过 Number.MAX_SAFE_INTEGER 的整数时,结果会出现尾数被截断或四舍五入的情况。这是因为双精度浮点数的有效位数只有 53 位,超出部分会被舍入到最接近的可表示值。例如,将 9007199254740993 转为字符串会得到 "9007199254740992",导致数据不一致。

const largeNum = 9007199254740993; console.log(String(largeNum)); // "9007199254740992" console.log(largeNum.toString()); // "9007199254740992"
预期输出:
"9007199254740992"
"9007199254740992"
BigInt 如何保证大数转字符串的准确性
使用 BigInt 可以完全避免精度丢失问题。BigInt 是 JavaScript 原生支持的任意精度整数类型,通过在后缀添加 n 来创建。将其转换为字符串时,会保留所有有效数字,不会发生舍入。例如,BigInt(9007199254740993).toString() 会返回正确的 "9007199254740993"。

const bigIntVal = 9007199254740993n; console.log(bigIntVal.toString()); // "9007199254740993"
预期输出:
"9007199254740993"
混合使用 Number 与 BigInt 时的类型错误
在代码中如果尝试将 BigInt 与 Number 进行混合运算或比较,会抛出 TypeError。例如,1n + 2 会导致错误,因为 JavaScript 不允许隐式类型转换。必须显式地将两者统一为同一类型后再进行操作,否则程序会在运行时中断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











