JSON.parse 转数字精度丢失问题

2025 年 10 月 10 日
 iv8d

JSON.parse('{"a":273848723742834827340}') 结果为 {a: 273848723742834820000} 精度丢失了,这种除了转字符串还有什么方法。

2724 次点击
所在节点    JavaScript
13 条回复
whusnoopy
2025 年 10 月 10 日
没有,js 里的 number 只有这个精度
ccccccc
2025 年 10 月 10 日
bzw875
2025 年 10 月 10 日
前端别计算这个值了,JS 的 number 存不了。改成字符串吧 JSON.parse('{"a":"273848723742834827340"}')
Ketteiron
2025 年 10 月 10 日
字符串是相对最好的处理方法,推特碰上这个坑也是这么做的,有更好的方法早用了。
UnluckyNinja
2025 年 10 月 12 日
你在 js 直接用变量存这个数都保留不了这个精度,更不可能在 js 里序列化/反序列化 json 还能保留精度了,老老实实在 js 里用 bigint 或高精度库处理,在 json 里用字符串保存(数字明文或者数值转 base64 )
uei
2025 年 10 月 12 日
const obj = JSON.parse('{"a":"273848723742834827340"}');

你打印 BigInt(obj.a)看看

参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
iv8d
2025 年 10 月 12 日
@UnluckyNinja 确实本身就无法保留,惭愧
qwerthhusn
2025 年 10 月 12 日
twitter 提供的 API ,除了返回 id 字段外,还会返回一个 id_str
AV1
2025 年 10 月 12 日
浮点数就是这样的,当数字大到一定程度的时候,连整数都不能精确表示了。
要么改用 string ,要么用 BigInt
xiangyuecn
2025 年 10 月 13 日
还好是发到了 JavaScript ,要是发到了 Java ,这锅就得你自己背了😂

照我这点开发经验,数据库里面要么是 int 、要么就是字符串,其他的统统存字符串😂 时间特殊点可以存 bigint 毕竟精确到 ms 也不 big

至于非自增 id ,感觉要是 UUIDv7 早出个 10 来年,用字符串都不用经过脑子思考了🤔
moverinfo
2025 年 10 月 13 日
micean
2025 年 10 月 13 日
@xiangyuecn java 不背这个锅。。。现在是很多人无脑上雪花,所以基本都是大数
Opportunity
2025 年 10 月 15 日
MDN 上不就有现成的方案吗?

const bigJSON = '{"gross_gdp": 12345678901234567890}';
const bigObj = JSON.parse(bigJSON, (key, value, context) => {
if (key === "gross_gdp") {
return BigInt(context.source);
}
return value;
});

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1164221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX