@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);
        };
    }
}
相关推荐
evans在进步2 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
m0_547486662 小时前
《Java程序设计与实践 》全套PPT课件2026
java·开发语言
土司大王3 小时前
LeetCode hto100——字母异位词分组
java·算法·leetcode
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
QCodingDev4 小时前
Spring AI Alibaba ReAct Agent实战:从Tool Calling到Agent,企业AI复杂业务该如何设计?
java·人工智能·agent·ai编程·spring ai
RainCity4 小时前
Java Swing 自定义组件库分享(十六)
java·笔记·后端
赵广陆5 小时前
企业实战:Markdown图片检索
android·java·开发语言
C++、Java和Python的菜鸟5 小时前
第3章 从0开始用若依
java·开发语言
Json____5 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
counting money7 小时前
Spring AI Alibaba 从入门到实战:构建企业级 AI 应用
java·人工智能·spring