uniapp使用uView框架,后端传16位数以上时出现精度缺失的情况

news2024/12/27 11:29:22

1、使用 json-bigint,失败

2、使用 config 里的 getTask,失败

3、修改 dataType,成功

原因:

  • 通过ajax请求回来的数据在response和preview两种状态显示的是不同的。
  • response中的看到的数据格式其实是字符串(ajax请求回来的数据本质上是字符串格式),preview其实是用了JSON.Parse(字符串) 给我们做美化(格式化),这个转换过程中,一般不会出问题,但是,如涉及大数(一个很大的整数,超过了javascript最大的处理能力),就会产生转换精度丢失。
  • JavaScript 能够准确表示的整数范围在-2^532^53之间(不含两个端点),超过这个范围,无法精确表示这个值,这使得 JavaScript 不适合进行科学和金融方面的精确计算。 

 60f09502683540d2acf973c510808486.png

解决方法:

由于uView使用的是http请求插件是 luch-request(luch-request),去看了源码,发现:

81b3db70bc4c47cfa161922bd8379774.png

1、因此需要将 dataType 修改为 string,首先去 uview-ui --> libs --> luch-request --> adapters --> index.js下注释掉下图这行,如果不注释掉,即使在 request.js 中将 dataType 修改为 string,还是会进入这行,还是会进行 parse 转换。

e6761c0abf854aba8ae6b8f3acc8045c.png

 2、然后在 requent.js下:

 ee687bdfe74f4233b594c7f532473621.png

 3、在响应拦截里对响应回来的数据进行处理f66facf435874ed18e01839282aef090.png

成功转换: 

 beb2c00db86d4668ae3dc27cd59270e2.png

 request.js全部代码:

// 此vm参数为页面的实例,可以通过它引用vuex中的变量
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		config.baseURL = 'xxxxxx'; /* 根域名 */
		config.dataType = 'string';
		return config
	})
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
		config.data = config.data || {}
		// 根据custom参数中配置的是否需要token,添加对应的请求头
		if(config?.custom?.auth) {
			// 可以在此通过vm引用vuex中的变量,具体值在vm.$store.state中
			const token = uni.getStorageSync('token');
			config.header.Authorization = token
		}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})
	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		let data = response.data // 注意这个原来是 const ,因为后面要修改,所以改成 let

		var json = data.replace(/:s*([0-9]{15,})s*(,?)/g, ': "$1" $2')
		// 1.根据后端返回的数据调用一次或者两次replace替换

		var json1 = json.replace(/:s*([0-9]{15,})s*(,?)/g, ': "$1" $2')

		// 2.手动转换回json数据即可
		var trueData = JSON.parse(json1);

		// console.log('有问题的数据',response.data) //有问题的数据,长字段被四舍五入的数据
		console.log('正确的数据',trueData.data) //实际上正确的数据
		data = trueData
		
		// 自定义参数
		const custom = response.config?.custom
		if (data.code !== 200) {
			if (data.code == 401) { // token 失效
				uni.reLaunch({
					url: "/pages/login/login"
				})
			}
			// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
			if (custom.toast !== false) {
				uni.$u.toast(data.msg)
			}

			// 如果需要catch返回,则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise,请求不会进入catch中
				return new Promise(() => {})
			}
		}
		return data.data === undefined ? {} : data.data
	}, (response) => {
		// 对响应错误做点什么 (statusCode !== 200)
		return Promise.reject(response)
	})
}

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

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

相关文章

GPT-4 国内使用指南 保姆教程

gpt持续火爆,然鹅国内很多朋友还说不会使用,因此有必要科普一篇文章! app.educlub.icu很多朋友因为各种限制无法开通#ChatGPT Plus,而申请OpenAI的GPT-4 API也要慢慢排队(我的也还没下来)。于是在这里我搜…

3 个令人惊艳的 ChatGPT 项目,开源了!

过去一周,AI 界又发生了天翻地覆的变化,其中,最广为人知的,应该是 OpenAI 正式上线 ChatGPT iOS 客户端,让所有人都可以更方便的在手机上与 ChatGPT 聊天。 此外,Stable Diffusion 母公司 Stability AI 也…

智能文档处理黑科技,拥抱更高效的数字世界

目录 0 写在前面1 为何要关注智慧文档?2 图像弯曲矫正3 手写板反光擦除4 版面元素检测5 文档篡改检测总结 0 写在前面 近期,中国图象图形学学会文档图像分析与识别专业委员会与上海合合信息科技有限公司联合打造了《文档图像智能分析与处理》高峰论坛。…

OpenCloudOS开源Linux操作系统详解

OpenCloudOS是什么?OpenCloudOS是Linux哪个版本?OpenCloudOS是哪个国家的?OpenCloudOS是一个国产操作系统开源社区,OpenCloudOS的基础库和用户态组件完全与CentOS 8兼容,腾讯云百科分享OpenCloudOS Linux操作系统详细介…

基于MATLAB的无人机遥感数据预处理与农林植被性状估算实践技术

为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节,逐步摆脱人力依赖;在施肥灌溉环节构建智慧节能系统;在产量预测和商品定价生产管理环节提高效能。这些智慧农业迫切需要实现的目标,首先要解决的问题就是多源…

第三十六章 状态管理工具与总结

Redux 是一个渐进式的状态管理库,它不仅仅是一个库,同时也是一个框架。它提供了一组用于构建复杂应用程序的工具和库,其中包括一些浏览器插件。 在 Chrome 和 Firefox 浏览器上,已经存在一些 Redux 的浏览器插件,例如 …

「技术分享」汽车检测移动机器人应用,科聪赋能智能数字化检测!

2021年汽车无钥匙进入系统市场价值16亿美元,预计到 2027 年将达到 26.8 亿美元,在预测期内的复合年增长率超过10%。这一光明的市场前景,推动相关供应商推出复杂的集成电子系统。但过去,汽车制造环节在智能化、数字化和过程成本等方…

企业数字化转型到底该怎么做?

企业数字化转型涉及实施技术和利用数字工具来增强业务流程、改善客户体验和推动创新。主要包括: 愿景和战略:首先明确定义数字化转型目标。确定数字技术可以对企业的业务产生最重大影响的领域,例如运营效率、客户参与度或产品开发。 评估当前…

【Java EE】Spring Cloud Gateway

Spring Cloud Gateway 添加Spring Cloud Gateway术语表工作流程网关的作用路由负载均衡统一处理跨域发布控制流量染色统一接口保护统一业务处理统一鉴权访问控制统一日志统一文档 网关的分类实现网关开启日志断言过滤器 参考文档 https://springdoc.cn/spring-cloud-gateway/ …

BetaFlight Mark4之“妖怪”声音之二

BetaFlight Mark4之“妖怪”声音之二 1. 源由2. 回顾3. 分析4. 优化5. 数据6. 综述7. 参考资料8. 附录 1. 源由 在BetaFlight Mark4之“妖怪”声音大致做了如下测试: 滤波参数调整 (怀疑滤波参数问题,导致振动传入系统,进而桨叶转速变化产生异响)整机螺…

系统学习大模型的20篇论文

【引子】“脚踏实地,仰望星空”, 知其然还要知其所以然。读论文是一条重要的途径,这一篇文章https://magazine.sebastianraschka.com/p/understanding-large-language-models非常值得借鉴,不敢私藏,编译成文。 大型语言…

Vue-生命周期

Vue实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂在DOM、渲染-更新-渲染、卸载等一系列过程,我们成为Vue 实例的生命周期,钩子就是在某个阶段给你一个做某些处理的机会。 注册周期钩子​ 举例来说,mo…

聚观早报 | ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备

今日要闻:ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备;索尼正开发小尺寸折叠屏手机;万达辟谣大规模裁员;智能仿生手让截肢者重获手心的温度 ChatGPT登顶美区iOS免费榜 ChatGPT 在 iOS 美区免费 App 排行榜上位列…

一种轻量级的消息传输协议-MQTT

正文 大家周末好,我是bug菌~ 最近项目中用到了MQTT,感觉挺优秀的一种协议,所以这里分享一些相关的知识。 1 什么是MQTT MQTT是一种轻量级的消息传输协议,用于物联网设备和应用程序之间的通信。其最初由IBM开发&#xf…

TCP可靠数据传输

TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。 1 重传机制 TCP 利用重传机制解决数据包丢失的情况,常见的重传机制如下: 超时重传快速重传SACKD-SACK 1.1 超时重传 重传机制的其中一个方式,就是…

网络的七层模型

网络的七层模型 七层模型结构 OSI七层模型TCP/IP五层模型说明协议硬件解释应用层应用层网络服务与最终用户的一个接口HTTP HTTPS FTP TFTP SMTP POP3 IMAP TELNET SNMP DHCP这层不涉及硬件,主要是web应用的表形式为应用程序提供网络服务表示层数据的表示、安全、压…

[学习笔记] [机器学习] 6. [下]决策树算法(熵Entropy、信息增益(率)、基尼值(指数)、CART剪枝、特征工程特征提取、回归决策树)

7. 回归决策树 学习目标: 知道回归决策树的实现原理 前面已经讲到,关于数据类型,我们主要可以把其分为两类,①连续型数据和②离散型数据。 在面对不同数据时,决策树也可以分为两大类型: 分类决策树&…

第三篇:强化学习发展历史

你好,我是zhenguo(郭震) 这是强化学习第三篇,我们回顾一下它的发展历史:强化学习发展历史 强化学习作为一门研究领域,经历了多年的发展和演进。以下是强化学习的主要发展历史里程碑: 1950年代-1…

前沿重器[33] | 试了试简单的prompt

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

容器简单介绍

目录 一、容器简介​编辑 二、容器和虚拟化技术差异 三、容器基本概念 四、容器技术对企业优势 五、容器的工具 一、容器简介 docker只是容器工具,真正容器技术是LXC (linux container) 二、容器和虚拟化技术差异 虚拟机模式&#xff…