前后端联调时JS数据精度问题的解决

news2025/1/21 6:23:30

在JavaScript中,Number类型范围 -2^53 + 1 到 2^53 - 1,而在Java中Long类型的取值范围是 -2^63 + 12^63 - 1, 比JavaScript中大很多,所以后端能正常处理。

其实 ES6 引入了 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 这两个常量,用来表示这个范围的上下限。

Number.isSafeInteger()用来判断一个整数是否落在这个范围之内,如果超出JS的Number范围的,看到的输出可能会有精度丢失问题的。

解决方案:
  1. 后端解决:后端直接给前端返回字符串,不要返回Number类型的数字
  2. 前端解决:

方案一: 正则

 如果我们使用的是axios请求数据,Axios 提供了自定义处理原始后端返回数据的 API:transformResponse , 可以这样处理:

axios({  
method: method,  
url: url,  
data: data,  
transformResponse: [function (data) {  
    // 将Long类型数据转换为字符串
    const convertedJsonString = data.replace(/"(\w+)":(\d{15,})/g, '"$1":"$2"'); 
    return JSON.parse(convertedJsonString);  
}],  
})


// 假设后端返回的JSON数据如下:
const responseData = {
  id: 12345678901234567890, // 这是一个Long类型数据
  name: "John Doe"
};

// 处理过的json数据
console.log(responseData.id); // 这将输出字符串:"12345678901234567890"
console.log(typeof responseData.id); // 这将输出 "string"

 方案二:借助json-bigint这个第三方包,进行json序列化

 import JSONbig from "json-bigint";
    axios({  
    method: method,  
    url: url,  
    data: data,  
    transformResponse: [function (data) {  
+        const JSONbigToString = JSONbig({ storeAsString: true });
+          // 将Long类型数据转换为字符串
+          return JSONbigToString.parse(data);  
    }],  
    })
    
    
    // 假设后端返回的JSON数据如下:
    const responseData = {
      id: 12345678901234567890, // 这是一个Long类型数据
      name: "John Doe"
    };
    
    // 处理过的json数据
    console.log(responseData.id); // 这将输出字符串:"12345678901234567890"
    console.log(typeof responseData.id); // 这将输出 "string"

强烈推荐公众号:程序员成长指北,我担心文章会删除或者不好找,所以在自己博客copy了一份,见谅哈,因为我之前也遇到过这个问题,当时是后端将返回参数改成了字符串,发现原来前端也有解决方案。不过,如果后端入参限制了必须传Number类型的id的话,也还是不行,所以还是后端改起来更方便。

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

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

相关文章

开源与闭源:驾驭大模型未来的关键决断

在数字化的时代洪流中,开源与闭源的选择不断成为技术界的重要分水岭。随着特斯拉CEO埃隆马斯克的言论及其决策,公开支持开源,并糅合商业理念与技术革新,使得这场辩论再次成为公众关注的焦点。那么,在这场关乎技术发展脉…

八股文-TCP的三次握手

TCP协议是一种面向连接、可靠传输的协议,而建立连接的过程就是著名的三次握手。这个过程保证了通信的双方能够同步信息,确保后续的数据传输是可靠和有序的。本文将深入解析TCP三次握手的步骤及其意义。 漫画TCP的三次握手 TCP连接的建立采用了三次握手的…

vite动态配置svg图标及其他方式集合

文章目录 前言使用vite-plugin-svg-icons动态配置安装插件引入图标下载新建组件svg-icon.vue使用 使用vue组件动态配置总结如有启发,可点赞收藏哟~ 前言 在配置化的情况下,图标配置也显得极为重要的 使用vite-plugin-svg-icons动态配置 参考vite-plugin…

C#中.NET 7.0 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、移植(Migrations)数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 前文已经说过.NET 6.0 控制台应用通过EF访问…

【Python大数据笔记_day09_hive函数和调优】

hive函数 函数分类标准[重点] 原生分类标准: 内置函数 和 用户定义函数(UDF,UDAF,UDTF) ​ 分类标准扩大化: 本来,UDF 、UDAF、UDTF这3个标准是针对用户自定义函数分类的; 但是,现在可以将这个分类标准扩大到hive中所有的函数,…

1. redis入门到放弃

使用shutdown命令的时候,会在关机的同时生成一个RDB文件,使数据不丢失。redis虽然有16个库,但是基本上只会用0库,用其他的库没有意义。集群只能在0号库做mysql的读写,大约为写入600笔/s,读2000笔/s 一、Redis全局命令…

本地mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

背景介绍: MySQL版本5.7,系统Win7,启动mysql服务时提示如下 解决方案 【会删除库中数据及mysql注册信息】: 1、删除原服务MySQL57 C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld --remove MySQL572、清空data 清空…

elementPlus实现暗黑与白亮主题切换

elementPlus上面默认是支持黑白主题切换的。只需要给html标签添加dark类名并且在mian.ts中导入css变量即可 我们就按照它推荐的useDark这个hook来 useDark使用起来非常简单,只需引入使用即可。vue直接就可以使用,无需做什么其他操作 中文网地址&#…

Apache阿帕奇安装配置

目录 一、下载程序 1. 点击Download 2. 点击Files for Microsoft Windows 3. 点击Apache Lounge 4. 点击httpd-2.4.54-win64-VSI6.zip ​编辑​ 5. 下载压缩包 6.解压到文件夹里 二、配置环境变量 1. 右键我的电脑 - 属性 2. 高级系统设置 3. 点击环境变量 4. 点击系统…

wpf devexpress 自定义统计

总计统计和分组统计包含预定义总计函数。这些函数允许你计算如下: 数据列的数量(Count) 最大和最小值(Max和Min) 总计和平均值(Sum和Average) 处理GridControl.CustomSummary 事件或者使用 GridControl.CustomSumm…

2024清理mac苹果电脑内存免费工具CleanMyMac X4.15

当你使用苹果电脑时,内存的优化和清理变得至关重要。随着时间的推移,我们的电脑内存可能会变得拥挤,导致性能下降。清理内存可以提高电脑的速度和反应能力,并确保它始终在良好状态下运行。本文将向您介绍怎么清理苹果电脑内存的方…

深度学习入门(第一天)——深度学习必备知识点

深度学习要解决的问题 人工智能、机器学习、深度学习的区别于联系 机器学习的流程: 数据提取 特征工程 建立模型 评估与应用 特征工程可以说是建模过程中,最重要的部分。 既然特征工程是最重要的,常规我们会做各种各样的特征,…

Google codelab WebGPU入门教程源码<5> - 使用Storage类型对象给着色器传数据(源码)

对应的教程文章: https://codelabs.developers.google.com/your-first-webgpu-app?hlzh-cn#5 对应的源码执行效果: 对应的教程源码: 此处源码和教程本身提供的部分代码可能存在一点差异。运行的时候,点击画面可以切换效果。 class Color4 {r: number;g: numb…

英伟达真是赢麻了,深夜推出最强AI芯片霸场 | 百能云芯

10月14日凌晨,英伟达在2023年全球超算大会(Supercomputing Conference,SC)上正式宣布,升级旗舰AI芯片,推出全新的H200芯片,以处理更强大的人工智能系统。包括亚马逊的AWS、Alphabet的Google Clo…

完全随机设计的方差分析

一、说明 实验设计在科学研究中发挥着至关重要的作用,使研究人员能够从数据中得出有意义的结论。一种常见的实验设计是完全随机设计(CRD),其特征是将实验单元随机分配到治疗组。CRD 的方差分析 (ANOVA) 是一种统计技术&#xff0c…

【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 map和set 1. 前言2. map和set介绍3. pair结构介…

一个开源的汽修rbac后台管理系统项目,基于若依框架,实现了activiti工作流,附源码

文章目录 前言&源码项目参考图: e店邦O2O平台项目总结一、springboot1.1、springboot自动配置原理1.2、springboot优缺点1.3、springboot注解 二、rbac2.1、概括2.2、三个元素的理解 三、数据字典3.1、概括与作用3.2、怎么设计3.3、若依中使用字典 四、工作流—…

pytorch文本分类(一):文本预处理

pytorch文本分类(一):文本预处理 本文为自己在鲸训练营答题总结,作业练习都在和鲸社区数据分析协作平台 ModelWhale 上。 🚩学习任务原链接在这里 相关数据链接:https://pan.baidu.com/s/1iwE3LdRv3uAkGGI…

企业工商四要素核验API的实现原理和功能介绍

引言 随着社会经济的不断发展,对企业信息的准确性和可信度要求也越来越高。为了有效防范企业信息不实和欺诈行为,企业工商四要素核验API应运而生。该API可以通过传入企业名称、社会统一信用代码、法人名称、法人身份证等信息,快速进行核验&a…

UFT On录制Web应用时无法识别Chrome浏览器对象

使用UFT的Object Spy 无法识别浏览器对象 成功加载Web插件后,使用UFT的对象间谍无法识别Chrome浏览器的对象 有三种情况可能导致这个问题: 浏览器比例没有设置为100%浏览器版本太低,无法与插件匹配浏览器没有添加UTF One的插件 我的是第三个…