前端Long类型精度丢失:后端处理策略

文章目录

    • 精度丢失的具体原因
    • 解决方法
      • 1. 使用 `@JsonSerialize` 和 `ToStringSerializer`
      • 2. 使用 `@JsonFormat` 注解
      • 3. 全局配置解决方案
    • 结论

在这里插入图片描述

开发商城管理系统的品牌管理界面时,发现一个问题,接口返回品牌Id和页面展示的品牌Id不一致,如接口返回的是1816714744603811841,前端战胜的是1816714744603811800

这是因为在前端出现了数据精度丢失。

精度丢失的具体原因

JavaScript的Number类型用于表示浮点数,它遵循IEEE 754标准中的64位浮点数格式。这意味着它能够准确表示从(-2{53})到(2{53}-1)之间的所有整数。超出这个范围的整数值在转换为Number类型时可能会发生精度丢失,即原本不同的长整数会被转换成相同的浮点数值,从而导致数据失真。

解决方法

为了解决品牌ID在前后端传输过程中精度丢失的问题,可以采用以下几种解决方法:

1. 使用 @JsonSerializeToStringSerializer

在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 BrandVo {// 使用ToStringSerializer将Long类型的id字段转换为String类型@JsonSerialize(using = ToStringSerializer.class)private Long id;// 其他字段...
}

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

2. 使用 @JsonFormat 注解

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

示例代码:

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

这种方法同样可以确保Long类型的字段在序列化为JSON时以字符串形式出现,避免前端精度丢失的问题。

3. 全局配置解决方案

虽然使用注解可以在一定程度上解决问题,但对于大型项目,逐个字段添加注解不仅繁琐,还可能导致代码冗余和难以维护。因此,可以考虑使用全局配置的方式,一次性解决所有Long类型字段的序列化问题。

示例代码:

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.mzph.cn/diannao/51397.shtml

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

相关文章

Transformer--输入部分

🏷️上文我们简单介绍了Transformer模型的总体架构,本章我们主要介绍其输入部分 📖前言 📖文本嵌入层的作用 📖位置编码器的作用 📖前言 输入部分主要包括源文本嵌入层以及位置编码器,目标文本…

HX1838红外接收模块-红外遥控(外部中断+状态机)

目录 红外遥控 模块介绍 HX1838红外接收二极管 红外发射遥控器 遥控器键码 模块接线 NEC协议编码 状态机分析 驱动代码 IR.h IR.c main.c 红外遥控 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行…

Unity + Hybridclr + Addressable + 微信小程序 热更新报错

报错时机: Generate All 怎么All 死活就是报错 生成微信小程序,并启动后 报错内容: MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因: Hybridclr 开发文档 解…

使用 Baklib 构建多语言知识库

技术的快速发展使企业能够更轻松地走向全球。在国外市场寻找新机会的关键方面之一是了解并与新客户群互动。此外,如果您在特定人群中拥有任何现有客户,那么让您的企业网站和支持也以他们可以参与的语言提供是合乎逻辑的。 假设您的公司以英语为主导市场…

SSL/TLS和SSL VPN

1、SSL/TLS SSL安全套接字层:是一种加密协议,用于在网络通信中建立安全连接。它在应用层和传输层(TCP/IP)之间提供数据加密、服务器身份验证以及信息完整性验证 SSL只保护TCP流量,不保护UDP协议 TLS:传输层…

GORM:优雅的Go语言ORM库

文章目录 引言GORM原理基础使用安装GORM定义模型连接数据库CRUD操作 高级使用关联事务回调 优点结论 引言 在Go语言开发中,数据库操作是不可或缺的一部分。虽然直接使用SQL语句可以灵活地与数据库交互,但随着项目规模的扩大,SQL语句的编写、…

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…

华为od-开发-终端云面试总结

华为OD - 终端云 资面 主要问一些在校经历,做过那些项目,大学期间觉得做过的最有价值的事情,大学期间令你感到最有成就感的事情,期望薪资。 技术一面(1h20min)7.18 1、项目里使用到RPC去取代HTTP&#x…

Nginx周末部署

背景 Nginx是本人学习的一类中间件,上次完成了vue的搭建,所以顺便把项目加入Nginx吧 1. 镜像拉取与测试 查询dockerHub,选择最新最稳定的版本 docker pull nginx:stable-perl 执行下载 docker run -d --name mynginx -p 8080:80 -v D:\IM…

基于bert的自动对对联系统

目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…

【Python检查两个列表是不是有重复项有关案例】

以下是一些具体的例子,展示了如何使用不同的方法来检查两个列表是否有重复项: 例子1:使用集合 list1 [1, 2, 3, 4, 5] list2 [4, 5, 6, 7, 8]# 转换为集合并求交集 duplicates list(set(list1) & set(list2))if duplicates:print(&q…

面完英伟达算法岗,心态崩了。。。

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解…

DS1302时钟芯片全解析——概况,性能,MCU连接,样例代码

DS1302概述: 数据: DS1302是一个可充电实时时钟芯片,包含时钟(24小时格式或12小时格式)、日历(年,月,日,星期)、31字节RAM(断电数据丢失&#x…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin:Vue 中后台管理系统 在当今的前端开发世界里,fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架,简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点,以及如何快速上手和使用。 项目简介…

String的创建和拼接面试常考题详解

非常关键的 intern() 当intern()方法被调用的时候,如果字符串常量池中已经存在这个字符串对象了,就返回常量池中该字符串对象的地址;如果字符串常量池中不存在,就在常量池中创建一个指向该对象堆中实例的引用,并返回这…

面试场景题系列--(4)设计一个支持敏感数据存储和传输安全的加解密平台--xunznux

文章目录 设计一个支持敏感数据存储和传输安全的加解密平台1. 设计背景2. 需求分析日常开发中的加解密程序常见问题解决方案具体来说系统主要用例过程和功能系统需求 3. 概要设计3.1 部署模型3.2 加解密调用流程 4. 详细设计4.1 密钥领域模型4.2 核心服务类设计4.3 加解密数据接…

在Spring中优雅地注入Java集合:实现依赖注入的艺术

在Spring中,可以通过多种方式注入一个Java集合(如List、Set、Map等)。Spring提供了强大的依赖注入功能,允许你以声明的方式将集合类型的依赖项注入到你的bean中。以下是一些常用的方法: 1. 使用XML配置 在Spring的XM…

WSL for Windows

1、安装 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意,安装之后首次启动 Ubuntu 时&…

【过题记录】 7.25

Friends 所有的方案减去非法的方案就是合法的方案 对于一个人&#xff0c;找到他往后的最早出现的非法位置&#xff0c;后面所有的串都是非法 从后往前维护一个最小非法后缀即可。 #include<bits/stdc.h> using namespace std;#define int long longconst int N 1e610…

Linux——常见命令

Linux常用命令是Linux系统操作的基础&#xff0c;掌握这些命令能够极大地提高系统管理和文件操作的效率。以下是一些常用的Linux命令及其基本用法&#xff1a; 一、文件与目录操作 ls&#xff1a;列出目录内容 基本用法&#xff1a;ls [选项] [目录名]常用选项&#xff1a;-a…