js精度问题

news2024/10/7 16:24:43

1、问题场景:请求接口取得Number类型的数字和后端实际值不一致

比如:
后端返回10976458979374929,实际从接口拿到的是10976458979374928,在控制台也会得到这样的结果:
在这里插入图片描述
原因:

在JavaScript中,Number类型范围-2^53 + 1 到 2^53 - 1 。
ES6引入了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限。
可以用Number.isSafeInteger()用来判断一个整数是否落在这个范围之内
附:在Java中Long类型的取值范围是-2^63 + 1 到 2^63 - 1,比js处理数字范围大的多

解决方案:
  • 后端解决:
    方式1: 修改数据库存的类型为字符串
    方式2:返回接口时转为字符串类型给前端
  • 前端解决: response里转为字符串
    方式1:正则替换
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"

方式2:json序列化处理

//借助json-bigint这个第三方包来处理
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"

2、常用处理js精度缺失的第三方包

number-precision
主要方法:加减乘除(plus,minus,times, divides)以及求相近值(strip, round)

import NP from 'number-precision';

NP.plus(num1, num2, num3, ...)   //  num + num2 + num3
NP.minus(num1, num2, num3, ...)  //  num1 - num2 - num3
NP.times(num1, num2, num3, ...)  //  num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // num1 / num2 / num3
NP.strip(num)         // 取整
NP.round(num, ratio)  // 四舍五入

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

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

相关文章

Seata入门系列【5】事务分组原理及应用案例详解

1 事务分组 1.1 概念 事务分组:seata的资源逻辑,可以按微服务的需要,在应用程序(客户端)对自行定义事务分组,每组取一个名字。 例如以下配置中,定义了当前事务分组名为${spring.application.…

凉鞋的 Unity 笔记 108. 第二个通识:增删改查

在这一篇,我们来学习此教程的第二个通识,即:增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景层次窗口中,我们是对 GameObject 进行增删改查。 在 Project 文件窗口中,我们是对文件&文件夹进行增删…

Elasticsearch —索引性能技巧

目录 一、科学的测试性能 二、使用批量请求并调整其大小 三、存储 四、段和合并 五、其他 如果你是在一个索引负载很重的环境,比如索引的是基础设施日志,你可能愿意牺牲一些搜索性能换取更快的索引速率。在这些场景里,搜索常常是很少见的…

数据结构题型17-树、森林

文章目录 1 树转换为二叉树2 森林转换为二叉树3 二叉树转换为树4 二叉树转换为森林 1 树转换为二叉树 参考博客:如何将一棵树转化成二叉树 2 森林转换为二叉树 参考博客:树、森林与二叉树的转换 3 二叉树转换为树 参考博客:树、森林与…

开山之作 | YOLOv1算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言:Hello大家好,我是小哥谈。目标检测是计算机视觉领域的一项重要研究方向,它在许多应用领域中都得到了广泛应用,如人脸识别、物体识别、自动驾驶、视频监控等。在过去,目标检测方法主要采用基于RCNN、Fast R-CNN等深…

软件工程与计算总结(九)软件体系结构基础

目录 ​编辑 一.体系结构的发展 二.理解体系结构 1.定义 2.区分体系结构的抽象与实现 3.部件 4.连接件 5.配置 三.体系结构风格初步 1.主程序/子程序 2.面向对象式 3.分层 4.MVC 一.体系结构的发展 小规模编程的重点在于模块内部的程序结构非常依赖于程序设计语言…

学网络安全的过程 ,差点要了我的命

我真的好像感慨一下,这个世界真的给计算机应届生留活路了吗? 看着周围的同学,打算搞前端、JAVA、C、C的,一个两个去跑去应聘。你以为是00后整治职场? 真相是主打一个卑微:现阶段以学习为主(工资…

在Linux中掌握不同的命令,让创建文件变得易如反掌

在Linux中创建一个新文件很简单,但也有一些令人惊讶和灵巧的技术。​在本教程中,学习如何从Linux终端创建文件。​ 先决条件 访问命令行/终端窗口(Ctrl-Alt-F2或Ctrl-Alt-T) 具有sudo权限的用户帐户(对于某些文件/目录是可选的) 从命令行创建新的Linux文件 Linux的设计…

TXT文件恢复,简单3招,快速恢复文件!

“由于工作需要,我的电脑中保存了很多的TXT文件,但是在清内存时,我不小心删除了一些比较重要的文件,请问有什么方法可以恢复吗?” TXT文件是一种普通的文本文件格式,它包含了纯文本信息,没有任何…

股票价格预测 | Python基于RNN及股票预测实战

循环神经网络(RNN)是基于序列数据(如语言、语音、时间序列)的递归性质而设计的,是一种反馈类型的神经网络,其结构包含环和自重复,因此被称为“循环”。它专门用于处理序列数据,如逐字生成文本或预测时间序列数据(例如股票价格)。 (1)one to one:其实和全连接神经网络…

Pycharm 2023 设置远程调试

pycharm 版本 : 2023.2.1 整体流程参考:https://blog.csdn.net/xuanhaolaile/article/details/128293254 首先确定远程服务器上已经安装好 requirements.txt 中所需的依赖包。 1、SSH Configurations 添加远程服务器 2、Python Interpreter 注意&…

别再使用循环的方式筛选元素了!开发常用的Stream流+Lambda表达式过滤元素了解过吗?10000字超详细解析

目录 1. Stream 流的简单展示 1.1 抛出问题 1.2 传统解决问题的编码方式 1.3 Stream 流的方式过滤元素 2. Stream 流的核心思想 3. Stream 流的使用 3.1 获取 stream 流 3.1.1 单列集合获取 stream 流 3.1.2 双列集合获取 stream 流 3.1.3 数组获取 stream 流 3.1.4…

AD20统一修改相同元器件的名称和标号的方法

如图所示,我们原理图中有很多开关,比如说名字乱七八遭,想要整体快速修改应该怎么办呢? 解决方法:把鼠标指针放到原理图的空白处单击鼠标右键 点击查找相似对象之后鼠标变成了一个十字状,用十字状中心点击要…

凉鞋的 Godot 笔记 108. 第二个通识:增删改查

在这一篇,我们来学习此教程的第二个通识,即:增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景窗口中,我们是对 Node 进行增删改查。 在文件系统窗口中,我们是对文件&文件夹进行增删改查&#xff1…

Linux工具-远程登录/访问

测试环境:ubuntu 20.04 一、ssh服务 SSH(Secure Shell Protocol,安全的壳程序协议,基于tcp协议默认使用22端口),它可以通过数据包加密技术将待传输的数据包加密后再传输到网络上。通过ssh协议/服务&#…

ros之乌龟做圆周运动and订阅乌龟的位姿信息

一 .基于乌龟显示节点,通过话题发布,编码实现控制小乌龟做圆周运动 打开终端1,进入工作空间 ros_ws cd ros_ws启动节点(ros服务器) roscore新开终端2,启动乌龟节点(turtlesim ) rosrun turtlesim turtl…

企业数字化营销策略如何制定?企业开展数字化营销有的关键步骤?

​制定数字化营销策略是建立数字化营销体系的关键步骤,想要建立好的数字化营销策划,需要企业明确目标客户群体,通过了解他们的需求和行为,来制定相应的营销策略。例如,通过数据分析手段,企业可以确定目标客…

#JavaScript教程:循环遍历@FDDLC

一、普通的for循环(当然还有while循环和do while循环) 二、for of 遍历 三、for in 遍历 四、forEach 五、map方法 六、reduce方法 输出:543 七、filter方法 八、some方法

TensorFlow入门(二十三、退化学习率)

学习率 学习率,控制着模型的学习进度。模型训练过程中,如果学习率的值设置得比较大,训练速度会提升,但训练结果的精度不够,损失值容易爆炸;如果学习率的值设置得比较小,精度得到了提升,但训练过程会耗费太多的时间,收敛速度慢,同时也容易出现过拟合的情况。 退化学习率 退化学…

mysql误删误操作恢复数据,比传统方式和binlog2sql更快速用的恢复方式-reverse_sql恢复数据(单表多表)

场景: 误操作删除了某个表的数据,本文只讲工具的使用,首先自己通过mysqlbinlog或者记录找到误操作的时间范围:开始时间和结束时间,已经确定好是哪个binlog了下面以误删为例。 查看binlog是否开启 show variables like …