1. 背景:
后端商品实体的id字段为Long,从ES中查出封装,以Json的形式返回给前端。结果发现前端展示的的id全为 1244864296175140900。通过在后端打印查出的数据发现实际id有:1244864296175140890、1244864296175140889等等。
把后端打印的Json串放进在线Json工具,发现id也会变为1244864296175140900。
至此,排除了自己代码逻辑的问题。。。
2.原因:
当后端传Long类型给前端, Long类型数据大于17位时。前端拿到的数据: 第16位会四舍五入, 17位后的数据自动用0代替),在Json中就会出现精度丢失的情况。
哭了。。。
3.解决
(1)用String代替Long:
这种方式代价太大,数据库的id类型一般都会是bigint,对应Java中Long。
所以修改后需要修改很多地方。
(2)不修改Long类型,只在进行Json序列化时,以String的形式去序列化:
这种方式对原有代码不需要修改。
a. 使用SpringBoot的字段Json序列化方式:
@JsonSerialize(using = ToStringSerializer.class)
private Long skuId;
自己使用的是这种。
b. 使用FastJson的字段Json序列化方式