当前位置: 首页 > article >正文

前端精度问题 (id 返回的和传给后端的不一致问题)

eg: 后端返回 id 10976458979374929
前端获取到的: 10976458979374928

原因:
js 中 Number类型范围-2^53 + 1 到 2^53 - 1
Number.isSafeInteger()用来判断一个整数是否落在这个范围之内。

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

解决方法:
方式1:数据库中存的就是数值型,修改数据库存的类型为字符串
方式2:返回接口时转为字符串类型给前端

方式1:
如果我们使用的是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"

方式2 : json序列化处理
使用JSON.parse()转换为JS对象,但是由于JS的Number的范围为,超出安全整数范围无法精确表示。
我们可以借助json-bigint这个第三方包来处理。

json-bigint中的parse方法会把超出 JS 安全整数范围的数字转为一个 BigNumber
类型的对象,对象数据是它内部的一个算法处理之后的,我们要做的就是在使用的时候转为字符串来使用。

通过启用storeAsString选项,可以快速将BigNumber转为字符串,代码如下:

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

http://www.kler.cn/a/105181.html

相关文章:

  • Kotlin Lambda表达式与标准库中的高阶函数
  • python re 使用非捕获组来忽略第一个value的匹配结果
  • Python---Socket 网络通信
  • http post协议实现简单的rpc协议,WireShark抓包分析
  • 数据库Redis(二):基本数据类型
  • 经典卷积神经网络 - ResNet
  • leetcode经典面试150题---2.移除元素
  • Redis笔记
  • 数据结构——10.24
  • 【API篇】六、Flink输出算子Sink
  • C51--超声波测距
  • Qt之自定义QStringListModel设置背景色和前景色
  • 1.2、Python基础-函数
  • Java设计模式大揭秘,细致剖析5种经典模式
  • 你真的了解CPU和GPU?
  • 低概率Bug,研发敷衍说复现不到
  • 【Java 进阶篇】Java HTTP 概述
  • 使用AOP切面实现日志记录功能
  • Codeforces Round 904 (Div. 2) C
  • Pytorch指定数据加载器使用子进程