后端返回的id到前端后 后面几位数全部变成0了 问题解决

这里 我在java控制台上 输出了id的值
在这里插入图片描述
但请求到前端后 很明显就不太一样了
在这里插入图片描述
这个问题比较经典的叫法是 雪花算法生成的ID过长,前端接收精度丢失
原因
前端使用number类型进行接收,number类型的范围小于后台Long类型的范围,出现了精度丢失问题。

简单说 number 类型 接不了那么大的数值 后面的值直接被四舍五入了

这个问题 其实前后端都能处理
前端处理的话 我的文章 vue项目通过json-bigint在前端处理java雪花id过长导致失去精度问题有讲过
但我个人建议还是后端去处理 因为你要想 这个问题本身就是因为你后端不够成熟
因为个人经历不完整导致的 而且这个问题 所以 我觉得我们既然弄出了这个问题 还是由我们自己填上比较好

其实很简单
在这里插入图片描述
long到了前端转数字类型 有大小限制 但 字符串没有呀

这里 java long转字符串 可以用

long number = 1234567890L;
String str = Long.toString(number);

然后前端传回给你
字符串转 long 可以用

String str = "1234567890";
long number = Long.parseLong(str);

然后 我们运行项目 前端发送请求
在这里插入图片描述
可以看到 字符串就不会出现这个问题了
在这里插入图片描述

<think>嗯,用户问的是关于axios请求返回的精度问题。首先,我需要回忆一下以前处理类似问题的经验。通常,这类问题出现在处理大数字或者高精度小数的候,比如后端返回的Long类型数据在JavaScript中可能会因为精度丢失而导致前端显示错误。例如,数据库中的18位ID到了前端可能后面几位变成0。 接下来,我要考虑axios本身是否有什么设置会导致这个问题。不过axios主要是负责发送HTTP请求和接收响应,数据解析可能依赖于浏览器的内置JSON解析,或者Node.js的JSON.parse方法。所以问题可能出在JSON解析的过程中,JavaScript的Number类型无法精确表示过大的整数,导致精度丢失。 然后,用户可能的场景是什么呢?比如,他们可能在处理订单号、用户ID等长数字遇到了问题。这候,后端返回的数据可能以字符串形式传输会更合适,避免JSON解析的精度丢失。所以解决方法可能包括让后端将字段改为字符串,或者前端使用JSON-bigint之类的库来处理大数字。 另外,可能需要检查响应头的Content-Type是否正确,确保数据被正确解析。如果后端返回的是字符串,但前端误解析为数字,也可能导致问题。还有,如果涉及小数计算,比如货币,可能需要使用专门的库如decimal.js来保持精度。 总结一下,可能的解决方案有几个方向:修改后端返回数据类型为字符串,前端使用特殊库处理大数字,或者调整前后端的数据处理方式。同,要提醒用户在遇到精度问题,先检查数据在传输过程中是否被意外转换,使用开发者工具查看原始响应内容,以确定问题发生的环节。</think>关于 Axios 请求返回的 **数值精度丢失问题**,这里为您梳理关键要点和解决方案: --- ### 🚨 **问题现象** 当接口返回 **Long 型数值**(如 `18位订单ID`)前端可能得到错误值: ```js // 原始数据 { "id": 123456789012345678 } // 实际接收结果(后三位变0) { "id": 123456789012345000 } ``` --- ### 🔍 **问题根源** 1. **JavaScript 数值精度限制** - JS 的 `Number` 类型最大安全整数为 `2^53 - 1`(即 `9007199254740991`) - 超出该范围的整数在 JSON 解析会出现精度丢失 2. **Axios 的默认处理** - Axios 使用浏览器内置的 `JSON.parse()` 解析响应数据 - `JSON.parse()` 自动将数字转为 JS 的 `Number` 类型 --- ### 💡 **解决方案** #### 方案 1:后端返回字符串格式(推荐) 让后端将 Long 类型字段改为 **字符串格式** 返回: ```json { "id": "123456789012345678" } ``` #### 方案 2:前端自定义 JSON 解析 使用 `json-bigint` 库处理大整数: ```bash npm install json-bigint ``` ```js import JSONBig from 'json-bigint'; axios.get('/api/data', { transformResponse: [data => JSONBig.parse(data)] }) ``` #### 方案 3:特殊场景处理 若必须使用数字类型,可添加 **精度补偿逻辑**: ```js axios.get('/api/data').then(response => { const rawData = response.request.responseText; // 获取原始响应文本 const id = rawData.match(/"id":(\d+)/)[1]; // 用正则提取原始值 }); ``` --- ### ⚠️ **注意事项** - 使用 `json-bigint` ,大数字会转换为 `BigNumber` 对象,需调用 `.toString()` 使用 - 小数精度问题可使用 `decimal.js` 库处理 - 确保服务器响应头包含 `Content-Type: application/json` --- ### 🔧 **调试建议** 1. 打开浏览器开发者工具,查看 **Network 原始响应** 2. 对比原始响应与 JS 解析后的数据差异 3. 使用 `typeof` 检查数值类型是否为 `string`/`number` 通过以上方法,可以有效解决JavaScript 数值精度限制导致的 Axios 返回值异常问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值