问题描述
接口返回数据的时候,有一个Long类型的主键字段(使用雪花算法生成的19位数字),单元测试、postman、apifox的返回数据均与数据库数据一致(1614468766644559873),前端浏览器查看返回数据却不一致(1614468766644560000)。
原因
Java中Long类型可以表示的最大值是2 ^63-1,而JS的基础类型Number可以表示的最大值是 2 ^53(9007199254740992,共16位)。所以后端返回的数字数据在大于Number能表示的最大值时,JS无法正确解析从而出现精度丢失的问题。
解决方案
1、将返回给前端的Long类型数据改为String类型(常用);
2、在Long类型字段加上注解 @JsonSerialize(using = ToStringSerializer.class) 或者 @JsonFormat(shape = Shape.STRING)。