Spring Boot 处理 Long 精度丢失问题

问题

数据库中有一个 bigint 类型的字段,对应 Java 后台类型为 Long。接口返回给前端后,页面上显示的数据和数据库中的不一致——后面几位全变成了 0。

原因是前端 JavaScript 的 Number 类型只有 53 位安全整数,超过 2^53 的长整型数值无法精确表示,导致精度丢失。

解决方式一:全局配置数字转字符串输出

Jackson 有一个配置参数 WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字转成字符串输出:

1spring:
2  jackson:
3    generator:
4      write_numbers_as_strings: true

解决方式二:字段级注解

只对需要的字段生效,使用 @JsonSerialize 注解:

1@JsonSerialize(using = ToStringSerializer.class)
2private Long bankcard;