举个例子:
这是例子结构:
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道路上越走越远,高歌猛进,谢谢!