JSON.parse()大整数精度丢失的问题和解决方法

小白终成大白


文章目录


前言

调试代码时候感觉出鬼了

接口给我的

javascript 复制代码
console.log(extra);
const extraObj = JSON.parse(extra)
console.log(extraObj);
```javascript
在这里插入代码片

我打印出来

{"contentId":1996543874746863617,"commentId":1996544548632276994}

明明是3617打出来就是3600

打出来就是3600

我天呐 当时脑子嗡一下 怎么事 出鬼了

一、原因

数字在JSON.parse之后被近似了!

这是因为JavaScript的Number类型有精度限制。JavaScript的Number类型使用IEEE 754双精度浮点数,它的精度范围大约是-253到253之间。超过这个范围的整数可能无法精确表示,会被近似处理。后端数据提供的contentId是1996543874746863617,这个数字明显超过了2^53(约9e15),所以在JSON.parse的时候会被近似。

二、解决办法

可以把大数字作为字符串处理,或者使用BigInt类型

1.引入库

c 复制代码
pnpm add json-bigint

我这个项目不想引入新的库了 所以选择了第二种

2.字符串处理

c 复制代码
// 处理大整数精度丢失问题:将JSON字符串中的大整数转换为字符串
		const safeJsonStr = extra.replace(/"contentId":(\d+)/g, '"contentId":"$1"').replace(/"commentId":(\d+)/g, '"commentId":"$1"');
		const extraObj = JSON.parse(safeJsonStr)
		console.log(extraObj);
		const id = extraObj.contentId
		console.log(id);

这回打印就没有出现问题了


总结

记录一下自己的问题 加深处理印象

感谢观看

相关推荐
数据狐(Datafox)8 小时前
京东商品列表API接口解析(附 JSON 样例)
数据库·爬虫·json
mengzhi啊18 小时前
缓存类CacheDataManager把临时数据存入json。做成插件·
qt·缓存·json
golang学习记1 天前
Go 1.27新特性: json/v2使用有趣指南
开发语言·golang·json
Token掘金室1 天前
JSON模式结构化输出报错
java·服务器·json
她说..1 天前
MySQL JSON 处理学习文档
学习·mysql·json
数据狐(Datafox)1 天前
京东商品详情API接口解析(附 JSON 样例)
java·开发语言·json
Wang's Blog3 天前
Java框架快速入门: Spring Security+OAuth2之自定义认证过滤器实现JSON登录
java·spring·json
淼澄研学3 天前
Win11 Dev Home与WinGet实操:基于JSON的声明式环境配置指南
json
可乐鸡翅yeah_3 天前
开发调试高频痛点解决,一站式在线加密解密与编码转换实战
json·加密解密·json在线转换
小疯仔4 天前
轨迹在地图上“漂“了 500 米?一文吃透 WGS-84→GCJ-02 坐标转换引擎(GPX→JSON 实战源码剖析)
小程序·json·notepad++