@JsonSerialize(using = ToStringSerializer.class) 为什么能解决前后端 Long 精度丢失问题

目录

  • 前言
  • [1. 原理](#1. 原理)
  • [2. 解决方式](#2. 解决方式)

前言

Java基本知识:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

数据库中的 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);
        };
    }
}
相关推荐
宸津-代码粉碎机5 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
噢,我明白了6 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅6 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑6 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1116 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383007 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu7 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
周杰偷奶茶7 小时前
【Java】数据类型与变量
java·开发语言
code斗7 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特7 小时前
【C++进阶】map和set
java·开发语言·c++