前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >处理js的JSON.parse中Number太长导致精度丢失问题

处理js的JSON.parse中Number太长导致精度丢失问题

作者头像
阿超
发布2024-08-23 17:13:44
1290
发布2024-08-23 17:13:44
举报
文章被收录于专栏:快乐阿超

大自然的真实和单纯,常是重要艺术极点的基础。——恩格斯

代码如下:

代码语言:javascript
复制
"token".split(".").slice(0,2).map(i=>JSON.parse(atob(i)))

这里主要是 JSON.parse 导致的,我简单复现一下

代码语言:javascript
复制
JSON.parse('{"id":9052710354240385291}')

得到的是

代码语言:javascript
复制
{id: 9052710354240385000}

可以看到后面的 291 变为 000

解决方式这里使用正则匹配 /:\s*([-+]?\d+(\.\d+)?([eE][-+]?\d+)?)/g

例如:

代码语言:javascript
复制
JSON.parse('{"id":9052710354240385291}'.replace(/:\s*([-+]?\d+(\.\d+)?([eE][-+]?\d+)?)/g, (match, p1) => {
                if (Math.abs(p1) > Number.MAX_SAFE_INTEGER) {
                    return `:"${p1}"`;
                }
                return `:${p1}`;
            }))

得到

代码语言:javascript
复制
{id: '9052710354240385291'}

这里注意,我们只对超长数字进行了处理

代码语言:javascript
复制
JSON.parse('{"id":9052710354240385291,"age":23}'.replace(/:\s*([-+]?\d+(\.\d+)?([eE][-+]?\d+)?)/g, (match, p1) => {
                if (Math.abs(p1) > Number.MAX_SAFE_INTEGER) {
                    return `:"${p1}"`;
                }
                return `:${p1}`;
            }))

得到的是:

代码语言:javascript
复制
{id: '9052710354240385291', age: 23}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档