当前位置: 首页 > 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.xdnf.cn/news/479449.html

相关文章:

  • 【pbootcms】打开访问首页显示未检测到您服务器环境的sqlite3数据库拓展,请检查php.ini中是否已经开启该拓展
  • 职业院校物联网安装调试员(工业数智技术)实训解决方案
  • 股指期货贴水为何会产生成本?
  • OceanBase 的系统变量、配置项和用户变量有何差异
  • 快速通关双链表秘籍
  • 旧 docker 版本通过 nvkind 搭建虚拟多节点 gpu 集群的坑
  • 智能裂变引擎 商业增长利器 —— 专业推客系统耀世而来
  • 图像对比度调整(局域拉普拉斯滤波)
  • 电子学会Python一级真题总结2
  • PHP 与 面向对象编程(OOP)
  • [250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
  • 使用pytest实现参数化后,控制台输出的日志是乱码
  • 数学复习笔记 12
  • RabbitMQ ④-持久化 || 死信队列 || 延迟队列 || 事务
  • AWS Elastic Beanstalk控制台部署Spring极简工程(LB版)
  • Mysql存储过程(附案例)
  • LabVIEW光谱检测系统
  • 29、魔法微前端——React 19 模块化架构
  • 数值分析证明题
  • React底层架构深度解析:从虚拟DOM到Fiber的演进之路
  • 11.vue网页开启自动提交springboot后台查询-首页显示数据库表
  • Docker 无法拉取镜像解决办法
  • [MySQL排查] “Too many connections“ 错误?数据库最大连接数满了怎么办及优化
  • ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例
  • 高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案
  • 数据科学和机器学习的“看家兵器”——pandas模块 之六
  • 微信小程序点击按钮跳转链接并显示
  • 低代码开发平台活字格v11.0——AI驱动效率革命
  • w~深度学习~合集3
  • Word图片格式调整与转换工具