针对项目中后端实体返回Long类型的字段传给前端时出现的精度丢失大坑!

举个例子:

这是例子结构:

po是数据表实体

dao是数据访问层

service是业务层

controller是接口控制层

我们看一下实体SysApprovalPO的字段内容:

我们看到id是Long类型的,这时候我们在controller层中写一个查询queryList去访问数据表中的所有数据。

我们看一下SysApprovalService是如何写的:

直接调用了IService接口中的list()方法。

运行启动项目,可以通过postman测试,也可以用其他接口测试工具,比如Apifox或者Swagger也可以。这里使用swagger进行测试。

这是前端返回的结果,id是1719899556252504000

我们看看后端返回的结果,id是1719899556252504065

最后两位前端获取的时候变成了00,这是为什么呢?

我们看看阿里巴巴开发手册里面有这么一段话:

原来如此,js中接受数字类型的Number最大值是2^53 -1,也就是9007199254740992,总共是16位,那咱们现在这个id是19位,超过了,就会丢失精度。

所以我们该如何解决呢?有三种方法:

①直接将该实体字段换成String

②可以在属性上增加注解,如果使用的Jackson,可以添加 @JsonFormat(shape = JsonFormat.Shape.STRING) 或者 @JsonSerialize(using = ToStringSerializer.class) 注解。

③Jackson2ObjectMapperBuilderCustomizer

总结:

后端返回实体中字段是long类型,返回给前端会出现精度丢失的问题大坑!原因是因为js中Number最大值

2^53 -1,也就是9007199254740992,总共是16位

和java中Long的最大值

2^64 - 1,总共是19位。

不相同,会产生精度丢失问题。解决方法是

①直接将该实体字段换成String

②可以在属性上增加注解,如果使用的Jackson,可以添加 @JsonFormat(shape = JsonFormat.Shape.STRING) 或者 @JsonSerialize(using = ToStringSerializer.class) 注解。

③Jackson2ObjectMapperBuilderCustomizer

最后:

如果大家觉得这篇文章对你们有所帮助的话,麻烦点个免费的赞赞,也祝各位码农在IT道路上越走越远,高歌猛进,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值