前端js传入Long类型精度丢失解决办法

在业务开发中遇到SQL更新数据受影响行数为0的情况,经检查发现前端传递的ID与数据库实际ID存在精度差异。原因是JavaScript的Number类型限制导致长整型数据精度丢失。为解决此问题,自定义了Jackson ObjectMapper,将Long转换为String序列化,避免精度问题,并在WebMvc配置中替换默认转换器,确保数据正确传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

问题背景

 解决过程

1.对比数据库数据

2.查询资料

解决方法


问题背景

在进行业务开发的 时候发现更新数据库中的一条数据没有成功,查看SQL日志发现SQL正常执行无错误信息,但是受影响行数为0,但是数据是从前端传过来的 ,一定是有这条数据存在的,那么为什么会有0条受影响呢?

 解决过程

1.对比数据库数据

我们去数据库中查找id为1597786380514103300的这条数据时,发现确实没有这条数据,然后我们又根据这条数据的其他信息找到了一条数据,发现前端发送过来的id最后两位与数据不一致  

下图为数据库中的数据id  和前端展示的id

 

 通过两个id的对比,我们大致猜测是id从后端到前端展示的某个环节中一定发生了让数据丢失精度的问题。

<
<think>嗯,用户想知道如何在前端传递long类型的参数,并且需要方法和注意事项。首先,我得回忆一下前端和后端交互时处理数据类型的常见方式。通常,前端使用JavaScript,而JS中的数字类型是双精度浮点数,能够确表示的整数范围是-2^53到2^53。但long类型在Java等后端语言中是64位的,范围更大,所以可能会有精度丢失的问题。这时候,把long转成字符串传递可能更安全。 接下来要考虑的是具体的前端框架,比如axios或者fetch API,在发送请求时如何传递参数。如果是GET请求,参数放在URL里,如果是POST,可以放在请求体里,比如JSON格式。但JSON中的数字同样会有精度问题,所以最好用字符串形式传递。 另外,用户可能没有明确说明他们使用的技术栈,但通常RESTful API会用JSON,所以需要确保后端能够正确解析字符串形式的long。比如在Spring Boot中,可以使用@RequestParam或者@PathVariable来接收字符串,然后转换成Long类型。 还要注意一些框架的自动转换可能会出问题,比如如果前端传的是数字,但超出JS的安全范围,后端解析时可能会出错。所以必须前后端都统一用字符串来处理大整数。 安全性方面,传输过程中用HTTPS是必须的,防止中间人窃取数据。另外,参数校验也很重要,确保传入的是有效的数字字符串,避免注入攻击或者其他恶意输入。 可能还需要考虑时间戳的情况,因为时间戳经常是long类型前端可能需要格式化显示,这时候传递long然后前端转换日期,但同样要注意精度问题。 总结一下,步骤应该是:前端long类型转为字符串,通过HTTPS传输,后端接收字符串并转换为long,同时做好校验和错误处理。还要注意各个框架的配置,比如Jackson在序列化时的设置,避免自动转换导致的问题。</think>### 前端传递 long 类型参数的方法及注意事项 #### 方法 1. **字符串形式传递** 由于 JavaScript 的 `Number` 类型最大安全整数为 $2^{53}-1$,而 Java 的 `long` 类型为 64 位整数,直接传递可能造成精度丢失。建议将 long 类型转换为字符串传递: ```javascript // 前端代码示例(以 Axios 为例) axios.get('/api/data', { params: { id: "1234567890123456789" // 以字符串形式传递 } }); ``` 2. **JSON 序列化** 在 POST 请求中,通过 JSON 字段传递时需显式声明为字符串: ```json { "timestamp": "1640995200000" } ``` 3. **结合时间格式化工具** 若参数为时间戳,可使用 `DateTimeFormatter` 等工具进行格式化后传递[^2]: ```javascript // 前端格式化时间戳(如需要) const timestamp = new Date().getTime().toString(); ``` #### 注意事项 1. **精度问题** - 避免直接使用数字类型传递超过 $2^{53}-1$ 的值,否则前端可能丢失精度。 - 后端接收时需从字符串解析为 long,例如 Spring Boot 中使用 `@RequestParam` 或 `@PathVariable`: ```java public ResponseEntity<?> getData(@RequestParam("id") String idStr) { long id = Long.parseLong(idStr); // 业务逻辑 } ``` 2. **数据校验** - 前端需验证字符串是否为有效数字格式。 - 后端需捕获 `NumberFormatException` 并返回友好错误提示。 3. **协议安全** 使用 HTTPS 协议加密传输,防止敏感参数被截获[^1]。 4. **框架兼容性** - 若使用 Spring Boot,可通过配置 `Jackson` 实现全局 long 转字符串: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.getObjectMapper().configure(SerializationFeature.WRITE_NUMBERS_AS_STRINGS, true); converters.add(converter); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值