解决前端精度丢失问题:后端Long类型到前端的处理策略

news2025/1/24 5:45:48

在Web开发中,我们经常遇到前后端数据类型不匹配的问题,特别是当后端使用大数据类型如Long时,前端由于JavaScript的数字精度限制,可能导致精度丢失。本文将深入探讨这个问题,并提供两种有效的解决方法。

一、问题背景

在后端开发中,为了确保数据的完整性和精度,我们可能会选择使用Long类型来存储某些数据,如订单ID、用户ID等。然而,当这些数据通过API传输到前端时,由于JavaScript中Number类型的精度限制(最大安全整数为2^53-1),如果Long类型的值超过了这个范围,就可能导致精度丢失。
在这里插入图片描述

二、解决方法

针对这个问题,我们可以采取以下几种解决方法:

方法一:使用@JsonSerialize注解将Long类型转换为String类型

在Java后端中,我们可以使用Jackson库的注解功能,将Long类型的字段在序列化为JSON时转换为String类型。这样,前端接收到的数据就是字符串形式,避免了精度丢失的问题。
示例代码如下:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;  
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;  
import lombok.Data;  
  
@Data  
public class PayOrderVo {  
  
    // 使用ToStringSerializer将Long类型的id字段转换为String类型  
    @JsonSerialize(using = ToStringSerializer.class)  
    private Long id;  
      
    // 其他字段...  
}

通过这种方式,我们可以确保后端返回的JSON中,Long类型的字段都以字符串的形式存在,前端可以直接将其作为字符串处理,无需担心精度问题。

方法二:使用@JsonFormat注解将Long类型格式化为String

除了使用ToStringSerializer,Jackson还提供了@JsonFormat注解,它允许我们指定字段的序列化格式。当我们将shape属性设置为JsonFormat.Shape.STRING时,Long类型的字段也会被格式化为字符串。
示例代码如下:

import com.fasterxml.jackson.annotation.JsonFormat;  
import lombok.Data;  
  
@Data  
public class PayOrderVo {  
  
    // 使用@JsonFormat注解将Long类型的id字段格式化为String  
    @JsonFormat(shape = JsonFormat.Shape.STRING)  
    private Long id;  
      
    // 其他字段...  
}

这种方法同样可以确保Long类型的字段在序列化为JSON时以字符串形式出现,避免前端精度丢失的问题。
前两种通过注解的方式确实可以有效地解决Long类型数据在前后端传输中的精度丢失问题。然而,当项目中存在多个类,且这些类中的多个字段都需要将Long类型转换为String类型返回给前端时,逐一为每个字段添加注解不仅繁琐,还可能导致代码冗余和难以维护。为了更优雅、高效地解决这一问题,我们可以考虑使用全局配置的方式,一次性解决所有Long类型字段的序列化问题。这样,我们不仅能提高开发效率,还能确保代码的一致性和可维护性。接下来,我们将详细探讨如何通过全局配置来实现这一目标。

方法三:全局配置Jackson将Long类型序列化为String

除了对单个字段进行注解配置外,我们还可以进行全局配置,使得所有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.boot.autoconfigure.condition.ConditionalOnMissingBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.context.annotation.Primary;  
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;  
  
@Configuration  
public class JacksonConfig {  
  
    @Bean  
    @Primary  
    @ConditionalOnMissingBean(ObjectMapper.class)  
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {  
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();  
        SimpleModule simpleModule = new SimpleModule();  
        // 将Long类型序列化为String类型  
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);  
        objectMapper.registerModule(simpleModule);  
        return objectMapper;  
    }  
}

在这个配置中,我们创建了一个自定义的ObjectMapper Bean,并注册了一个SimpleModule,该模块使用ToStringSerializer将Long类型序列化为String类型。这样,整个应用中所有Long类型的字段在序列化时都会自动转换为String类型。

三、总结

前端精度丢失问题是一个常见的挑战,但通过上述三种方法,我们可以有效地解决这个问题。在实际开发中,我们可以根据项目的具体情况和需求选择合适的方法。对于需要精确表示大数字的场景,将Long类型转换为String类型是一个简单而有效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习从0开始——007输入与输出

Python学习从0开始——007输入与输出 一、简单输出二、复杂输出2.1引用变量2.2format()函数2.3手动格式化 三、读写文件3.1open()3.2操作文件对象3.3使用 json 保存结构化数据 一、简单输出 str() 函数返回供人阅读的值,repr() 则生成适于解释器读取的值&#xff0…

加州大学欧文分校英语基础语法专项课程01:Word Forms and Simple Present Tense 学习笔记

Word Forms and Simple Present Tense Course Certificate 本文是学习Coursera上 Word Forms and Simple Present Tense 这门课程的学习笔记。 文章目录 Word Forms and Simple Present TenseWeek 01: Introduction & BE VerbLearning Objectives Word FormsWord Forms (P…

【AI】ubuntu 22.04 本地搭建Qwen-VL 支持图片识别的大语言模型 AI视觉

下载源代码 yeqiangyeqiang-MS-7B23:~/Downloads/src$ git clone https://gh-proxy.com/https://github.com/QwenLM/Qwen-VL 正克隆到 Qwen-VL... remote: Enumerating objects: 584, done. remote: Counting objects: 100% (305/305), done. remote: Compressing objects: 10…

Java单链表和LinkedList的实现

一、单链表的实现 无头单向非循环链表 定义异常用于判断所给位置是否合法 public class IndexNotLegal extends RuntimeException{public IndexNotLegal(){}public IndexNotLegal(String smg){super(smg);} } class ListNode中包含当前节点的值和下一个节点指向 实现链表的…

摄影杂记二

一、相机操作指南 ⑴按键说明: 除了常规的几个模式,里面就特殊场景可以看一下,有全景,支持摇摄。 lock:多功能锁。可以锁定控制按钮和控制环。在设置中找到多功能锁,可以设置锁定什么。 m-fn:多…

自定义校验器

1.前端校验 <template><el-dialog:title"!dataForm.brandId ? 新增 : 修改":close-on-click-modal"false":visible.sync"visible"><el-form:model"dataForm":rules"dataRule"ref"dataForm"keyu…

解决方案AssertionError: Torch not compiled with CUDA enabled

文章目录 一、现象二、解决方案 一、现象 报错显示 s torch.from_numpy(padding_seq([s])).cuda().long() File "D:\Anaconda3\lib\site-packages\torch\cuda\__init__.py", line 221, in _lazy_initraise AssertionError("Torch not compiled with CUDA ena…

基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(论文+源码)_kaic

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了亿家旺生鲜云订单零售系统的开发全过程。通过分析亿家旺生鲜云订单零售系统管理的不足&#xff0c;创建了一个计算机管理亿家旺生鲜云订单零售系统的方案。文章介…

Text-Driven Object Detection 关于结合文本的目标检测

1、简单介绍 首先说明&#xff0c;本文目的主要是水一篇CSDN博客&#xff0c;顺便说一下和标题相关的认识。 近几年&#xff0c;在目标检测领域关于多模态的目标检测工作已成了主流&#xff0c;趋势仍在延续&#xff0c;未来仍有很大挖掘空间。这里说的多模态不是简单的多源数…

Sql优化篇-干货总结大全

前言 我们经常会听到Sql优化的一个概念&#xff0c;但其实sql优化不一定就是说sql语句写的有问题&#xff0c;它可能是因为cpu资源爆满&#xff0c;或者内存空间不足&#xff0c;它也会导致sql执行卡顿&#xff1b;或者说表设计层面&#xff0c;过滤条件没有加索引之类的 等等…

【STL】list的底层原理及其实现

文章目录 list的介绍list的整体结构设计list的构造代码模拟实现&#xff1a; list节点类的实现list 迭代器Iterator的使用以及实现Iterator的使用Iterator的底层实现反向迭代器 list与vector的比较实现list类 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

springCloud-LoadBalancer负载均衡微服务负载均衡器LoadBalancer

2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBalancer替代 LoadBalancer默认提供了两种负载均衡策略&#xff08;只能通过配置类来修改负载均衡策略&#xff09; 1.RandomLoadBalancer-随机分配策略 2.RoundRobinLoadBalancer-轮询分配…

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 灰狼优化算法 此处略。 2.…

尚硅谷html5+css3(1)html相关知识

1.基本标签&#xff1a; <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…

Golang单元测试和压力测试

一.单元测试 1.1 go test工具 go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似&#xff0c;并不需要学习新的语法&#xff0c;规则和工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的…

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

SVG图标显示

SVG图标显示 1.安装SharpVectors.Wpf包 2.添加引用 xmlns:svgc"http://sharpvectors.codeplex.com/svgc/"3.加载svg文件&#xff0c;生成操作选择资源(Resource) 4.UI界面显示SVG图像 <Button Click"OnSaveFileClick" ToolTip"Save Svg File…

云原生安全当前的挑战与解决办法

云原生安全作为一种新兴的安全理念&#xff0c;不仅解决云计算普及带来的安全问题&#xff0c;更强调以原生的思维构建云上安全建设、部署与应用&#xff0c;推动安全与云计算深度融合。所以现在云原生安全在云安全领域越来受到重视&#xff0c;云安全厂商在这块的投入也是越来…

蓝桥杯—PCF8951

1.整个系统靠SDA和SCL实现完善的全双工数据传输 2.引脚图 AN1为光明电阻 AN3为滑动变阻 A0-A2均接地 时钟线连P20 地址线连P21 实物图 iic总线 谁控制时钟线谁是主设备 时序相关 官方提供的底层驱动代码 /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成…

Octopus V2:设备端super agent的高级语言模型

论文&#xff1a;Octopus v2: On-device language model for super agent论文地址&#xff1a;https://arxiv.org/abs/2404.01744模型主页&#xff1a;https://huggingface.co/NexaAIDev/Octopus-v2 Octopus-V2-2B Octopus-V2-2B 是一款具有20亿参数的开源先进语言模型&#…