为何76561198272848927 === 76561198272848930为真?SteamAPI Profile-ID在JS中异常如何解决
JavaScript大整数精度丢失问题解答
Hey there! Both of your questions boil down to the same key limitation in how JavaScript handles large integers—let's break this down clearly.
问题1:为什么76561198272848927 === 76561198272848930返回true?
JavaScript使用64位双精度浮点数来表示所有数值(包括整数)。这种格式的关键限制是:它只能精确表示介于-2^53和2^53之间的整数。具体来说,2^53等于9007199254740992——而你提到的这两个数都远大于这个阈值。
当整数超出2^53范围时,JavaScript无法再精确存储每一位数字,会自动将其近似到最近的可表示浮点数。在你的例子里,76561198272848927和76561198272848930被近似成了同一个浮点数,所以它们的相等比较会返回true。
问题2:Steam Profile ID被自动改成30,怎么修复?
这依旧是上面的精度问题在作祟:你的Profile ID 76561198272848927已经超出了2^53的范围,所以JavaScript在解析或存储它时,会自动将其近似到最近的可表示值,也就是76561198272848930。
可行的修复方案:
- 以字符串形式存储和传递ID:既然数字太大无法精确表示,就把它当作字符串处理。比如向SteamAPI请求时,直接传字符串版本的
"76561198272848927",而非数字类型,这样就能完全避免舍入问题。 - 使用
BigInt类型:ES2020引入了BigInt类型,专门用于处理任意精度的整数。你可以把ID写成76561198272848927n(注意末尾的n),这样就能精确存储和操作它了。需要注意的是,BigInt不能和普通Number直接混合运算,而且如果SteamAPI的库不支持BigInt参数,转成字符串传递会更稳妥。
字符串用法示例:
// 正确做法:以字符串形式传递ID const mySteamId = "76561198272848927"; steamApi.getProfile(mySteamId); // 假设API接受字符串类型的ID参数
BigInt用法示例:
// 用BigInt存储ID const mySteamId = 76561198272848927n; // 如果API需要字符串,就转成字符串传递 steamApi.getProfile(mySteamId.toString());
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

