雪花算法ID到前端之后精度丢失问题

问题遇到的现象和发生背景

小伙伴建了一张表,表的主键是id BigINT,用来存储雪花算法生成的ID

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
        #其他字段省略
);

使用Long 类型对应数据库ID数据。嗯,也没有问题,雪花算法生成的就是一串数字,Long类型属于标准答案!

@Data
public class User {
    private Long id;
//其他成员变量省略

在后端下断点。看到数据响应以JSON响应给前端,正常

{
id:1297873308628307970,
//其他属性省略
}

最后,这条数据返回给前端,前端接收到之后,修改这条数据,后端再次接收回来。奇怪的问题出现了:后端重新接收回来的id变成了:12978733086283000000,不再是1297873308628307970

求解决办法

返回字段上添加@JsonSerialize(using = ToStringSerializer.class) ,json已String类型解析


@JsonSerialize(using = ToStringSerializer.class)
private Long id;

转json的时候,可以指定long类型的数据,用字符串去解析,具体就要看你用什么工具了,一般都有注解的

原因是html上超过17还是18位的数字,会自动把后面几位转成0,所以你需要把这个id转成字符串传到前端

js的number类型有个最大值(安全值)。即2的53次方,为9007199254740992。如果超过这个值,那么js会出现不精确的问题。这个值为16位。你返给前端的时候要转成字符串,这样精度就不会丢失了

前端有位数限制,两种,一种是转字符串,一种是位数截取

可以写@JsonSerialize(using = ToStringSerializer.class)作用在实体类的id上面,也可以使用全局配置,默认将所有long类型的在序列化的时候转为string