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

前后端传输 Long 类型数据时(时间戳,雪花算法ID),精度丢失的根本原因

前后端传输 Long 类型数据时,精度丢失的根本原因是 JavaScript 的 Number 类型无法精确表示超过 53 位(64 位双精度浮点数)的整数,而 Java 的 Long 类型是 64 位整数。当后端返回的 Long 值超过 2^53-1(即 9007199254740991)时,前端解析会出现精度错误。

解决方案

方案一:后端将 Long 转为字符串(推荐)

后端修改(Spring Boot 示例)

  1. 局部方案:在字段上添加 @JsonFormat 注解

    public class UserDTO {@JsonFormat(shape = JsonFormat.Shape.STRING)private Long id; // 自动序列化为字符串
    }

  2. 全局方案:配置 Jackson 序列化规则

    @Configuration
    public class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilder jacksonBuilder() {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();// 所有 Long 类型转为字符串builder.serializerByType(Long.class, ToStringSerializer.instance);return builder;}
    }
     

前端处理
直接使用字符串类型的 ID,避免用 Number 类型解析:

javascript

// 正确:后端返回 { "id": "1234567890123456789" }
fetch('/api/user').then(res => res.json()).then(data => {const userId = data.id; // 直接作为字符串使用console.log(userId); // "1234567890123456789"});

方案二:前端特殊处理大整数

使用 JSON.parse 自定义解析(需确保后端不转字符串):

// 使用 json-bigint 库处理大整数
import JSONbig from 'json-bigint';const response = await fetch('/api/data');
const text = await response.text();
const data = JSONbig.parse(text); // 自动将大数字转为 BigInt 类型// 使用示例
console.log(data.id.toString()); // 转为字符串操作

方案三:后端使用 String 类型代替 Long

从根本上避免问题:

public class UserDTO {private String id; // 直接定义为字符串类型
}

关键原因说明

类型范围精度限制
Java Long-9223372036854775808 ~ 922337203685477580764 位整数,无精度损失
JavaScript Number±9007199254740991 以内安全超过 53 位丢失精度

最佳实践

  1. 优先推荐方案一:后端统一将 Long 序列化为字符串,前端按字符串处理。

  2. 若前端需数值运算:将字符串转为 BigInt(注意浏览器兼容性):

    const bigIntId = BigInt("1234567890123456789"); // 字符串转BigInt
  3. 避免使用 Number() 或 parseInt() 转换大数字符串,否则仍会丢失精度。

通过统一数据类型定义(字符串传输),可彻底解决此问题,同时保持数据精确性。

http://www.xdnf.cn/news/9519.html

相关文章:

  • JavaSE核心知识点04工具
  • WebFuture:后台离开站点提示设置关闭后无效
  • 基于Matlab实现指纹识别系统
  • 一招解决 win10 安装 Abobe PR/AE 打不开或闪退
  • 如何在 Solana 上发币,并创建初始流动性让项目真正“动”起来?
  • 12.Java 对象冷冻术:从用户登录到游戏存档的序列化实战
  • 电子电路:开关电路技术深度解析
  • Ubuntu 24.04 LTS 和 ROS 2 Jazzy 环境中使用 Livox MID360 雷达
  • 2025年软件测试面试八股文(含答案+文档)
  • indel_snp_ssr_primer
  • 简历中项目经历怎么写?
  • 硬件服务器基础
  • C++11:系统类型增强
  • ‌ATR2652S双频GNSS低噪声放大器芯片技术解析
  • unityPc端设置了全屏(Exclusive Fullscreen)但是仍然有白边解决办法
  • 在 Linux 中让 ​​Gunicorn​​ 在后台运行(作为守护进程),有几种常用方法:
  • PHP中实现分布式架构的方法与工具全解析!
  • 【pg学习】-账号管理
  • 深入理解Nginx:详尽配置手册
  • Java复习Day21
  • 立体匹配视差图上色代码
  • OC—UI学习-1
  • GoldenDB管理节点zk部署
  • JavaScript- 4.2 DOM--定位元素
  • 《以撒的结合:四魂》桌游完全解析!
  • 说说线程有几种创建方式
  • 如何将通话记录从Android传输到Android
  • Tomcat- AJP协议文件读取/命令执行漏洞(幽灵猫复现)详细步骤
  • Linux的交换区
  • 《自动驾驶轨迹规划实战:Lattice Planner实现避障路径生成(附可运行Python代码)》—— 零基础实现基于离散优化的避障路径规划