@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);
        };
    }
}
相关推荐
NE_STOP15 小时前
Vide Coding--AI编程工具的选择
java
码云数智-园园16 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆16 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
小宇宙Zz16 小时前
Maven依赖冲突
java·服务器·maven
swordbob16 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
咖啡八杯17 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网17 小时前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记
摇滚侠17 小时前
IDEA 创建 Java 项目 手动整合 SSM 框架
java·ide·intellij-idea
源分享17 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Flittly17 小时前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring