目录
- 前言
- [1. 原理](#1. 原理)
- [2. 解决方式](#2. 解决方式)
前言
Java基本知识:
数据库中的 ID: 1729832798127398123
后端接口返回:
java
{
"id": 1729832798127398123
}
后端日志打印也完全正常。
但是到了前端:1729832798127398000
数字发生了变化,精度丢失了
这时候如果加上:
java
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
前端 suddenly 就正常了
1. 原理
Java 的 Long:
Long 最大值:9223372036854775807
是 64 位整数。
但是前端 JavaScript 的 Number:
java
Number.MAX_SAFE_INTEGER
// 9007199254740991
只能安全表示:2^53 - 1
也就是说:
Java Long 是 64 位
JS Number 只有 53 位精度
超过这个范围:1729832798127398123
JavaScript 无法精确表示。
1729832798127398123会被自动转换成:1729832798127398100
出现精度丢失。
2. 解决方式
方案一:字段加注解(最常见)
java
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
优点:
简单
精准控制
缺点:
每个字段都要写
方案二:全局配置(推荐)
java
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
return builder -> {
builder.serializerByType(Long.class, ToStringSerializer.instance);
builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
};
}
}