当前位置: 首页 > news >正文

Java 后端给前端传Long值,精度丢失的问题与解决

为什么后端 Long 类型 ID 要转为 String?

在前后端分离的开发中,Java 后端通常使用 Long 类型作为主键 ID(如雪花算法生成的 ID)。但如果直接将 Long 返回给前端,可能会导致前端精度丢失的问题,特别是在 JavaScript 环境中。


问题本质

JavaScript 的 Number 类型基于 IEEE 754 双精度浮点数,只能安全表示的整数范围是:

[-2^53 + 1, 2^53 - 1] => [-9007199254740991, 9007199254740991]

而 Java 的 Long 最大值是 9223372036854775807,远超 JS 能表示的范围。

如果后端返回:

{"id": 9223372036854775807
}

前端打印可能是:

console.log(data.id); // 输出 9223372036854776000(精度已丢失)

解决方案

方法一:全局配置 Jackson 将 Long 转为 String(推荐)

在 Spring Boot 项目中,可以通过配置 ObjectMapper,让所有 Long 类型序列化为 String,避免精度问题:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();SimpleModule simpleModule = new SimpleModule();// Long 和 long 全部转为字符串simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}
}

💡 生效后,所有 Long 类型字段将自动序列化为字符串,前端拿到的 ID 是 "9223372036854775807",避免精度问题。


方法二:仅对单个字段生效(局部注解)

如果你只想对部分字段(如 id)转为 String,可在字段上添加注解:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;public class UserDTO {@JsonSerialize(using = ToStringSerializer.class)private Long id;// 其他字段...
}

方法三:前端处理(不推荐)

虽然前端可以用字符串处理 ID,但如果后端返回的是数字,JS 在接收数据的第一步就已经丢了精度。因此根本的解决方式应该在后端。


总结

方式是否推荐说明
后端全局转 String✅ 强烈推荐统一、安全
局部字段注解✅ 适用于个别字段
仅前端处理❌ 不推荐精度可能已丢失,无法挽回
http://www.dtcms.com/a/194209.html

相关文章:

  • Java—— Stream流
  • 前端批量下载文件打包为zip
  • 机器学习知识自然语言处理入门
  • 基于PXIE 总线架构的Kintex UltraScale 系列FPGA 高性能数据预处理板卡
  • 黑马k8s(九)
  • 链表的中间结点数据结构oj题(力扣876)
  • 容器化-k8s-介绍及下载安装教程
  • python的家教课程管理系统
  • 等离子模块【杀菌消毒】
  • MIPI接口设计
  • 【Linux】ssh命令 – 安全的远程连接服务
  • Vue3项目,子组件默认加载了两次,使用 defineAsyncComponent 引入组件后只加载一次
  • InfluxDB 2.7 连续查询实战指南:Task 替代方案详解
  • 几个正整数常用的位运算操作
  • [特殊字符][特殊字符]知识库PHP版 | ChatMoneyAI宝塔面板Docker多部署
  • JMeter 教程:编写 GET 请求脚本访问百度首页
  • 描述性统计图表
  • Python-homework
  • 前端面经 8 JS中的this 手写call apply bind方法
  • Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
  • CSS- 2.1 实战之图文混排、表格、表单
  • 搭建运行若依微服务版本ruoyi-cloud最新教程
  • 实变函数 第二章 点集
  • STM32外设AD-轮询法读取模板
  • 【简单模拟实现list】
  • 腾讯云MCP数据智能处理:简化数据探索与分析的全流程指南
  • 利用腾讯云MCP提升跨平台协作效率的实践与探索
  • 水库雨水情测报与安全监测系统解决方案
  • [模型部署] 1. 模型导出
  • yocto5.2开发任务手册-7 升级配方