@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);
        };
    }
}
相关推荐
渡我白衣1 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
电商API_180079052471 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11111 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG1 小时前
2026/5/27 生产事故复盘与整改方案
java
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪2 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程
m0_587383002 小时前
点餐预约核销系统的架构脉络
java·架构·系统架构·需求分析
代码方舟3 小时前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享3 小时前
图灵Java互联网架构师六期
java·开发语言
坐吃山猪3 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程