Skip to content

开发技巧之 javascript 中 Long 类型精度丢失

在后端服务生成 Long 类型的数据库 ID 时(或者其他使用 Long 类型的数据库字段),当接口返回 JSON 数据给前端,前端拿到的值却是错的,而后端查看响应却是没问题的。

原因是 JavaScript 无法处理 Java 的长整型 Long 导致精度丢失,具体表现为主键最后两位永远为 0。

因此,要解决这个问题,比较好的方式是在后端接口响应给前端数据时,把 Long 字段转为 String 类型,这样前端接收到的是一个字符串,就不会有精度丢失的问题了。

在 Spring 应用中,只需要在需要响应的字段上加上 @JsonSerialize(using = ToStringSerializer.class) 注解即可。

java
@Data
public abstract class BaseEntity implements Serializable {

    /**
     * 自动生成主键,子类不可重写,但可以在项目中重新定义一个BaseEntity。
     * JsonSerialize:JavaScript 无法处理 Java 的长整型 Long 导致精度丢失,具体表现为主键最后两位永远为 0
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    protected Long id;
}