number类型超出16位的问题(前端、后端处理)
后台-插件-广告管理-内容页头部广告(手机) |
目录
1、前端解决方案
1.1 甩链接
1.3 对返回的json字符串进行数据预处理代码如下
2、后端解决方案
2.1 toString、String、'' 、new String() 自己悟、就是要改的地方多。
2.2拦截器 (可能超出范围的数值 前后端都可以写)
2.3 @JSONField(serializeUsing= ToStringSerializer.class) 推荐
今天写代码遇到了一个老接口返回数据 Long 类型 超过16位、前端 JS Number强类型转换数字超过16位精度丢失。
大家可以在页面控制台试一试
输入 1506837762369851394 变 1506837762369851400
前端又把参数传递给我保存数据库、导致数据对不上了。
造成原因:js的number类型有个最大安全值,即2的53次方(9007199254740992),超过这个值就会出现精度丢失的问题。
先聊前后端怎么解决、再分析下原因
1、前端解决方案
(如果接口涉及问题比较特殊、单一等就考虑前端处理、其实我不推荐这种方式)
虽然我不推荐这种方式、但我今天还是让前端处理了、因为接口复用、问题单一等等(最重要的是 别人写的老接口、用的地方多了、我但扛不住懒呀)
1.1 甩链接
我就甩给了前端大佬一个网页链接(后端想偷懒的请复制):
解决后端返回的number类型超出16位的问题 ,json-bigint库在axios中处理 - 简书
1.3 对返回的json字符串进行数据预处理代码如下
- {GMSFHM:1506837762369851394}
- GMSFHM:json中的key
- let ress = JSON.parse(res.replace(/\"GMSFHM\":(\d+)/,'"GMSFHM": "$1"'));
2、后端解决方案
做为后端的程序猿、当然又很多的处理方案了。宗旨就一句 "将数字类型(Long)变量转为字符串类型(String)即可"
2.1 toString、String、'' 、new String() 自己悟、就是要改的地方多。
2.2拦截器 (可能超出范围的数值 前后端都可以写)
在Response里面加个拦截器,
用正则匹配修改 超过16位的Number类型数值 ,修改为String类型
2.3 @JSONField(serializeUsing= ToStringSerializer.class) 推荐
1、pom中加入(推荐 1.2.83版本 23年5月8号太久远就查最新的注意漏洞)
-
-
com.alibaba - fastjson
-
1.2.83
2、对象基类加入
- @JSONField(serializeUsing = ToStringSerializer.class)
- @TableId(type = IdType.ASSIGN_ID)
- protected Long id;
溺水三千,我只取一瓢;
方法很多,我只举三种。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |