问题
接口响应vo:
@Data
public class QueryProductListVo implements Serializable {
private Long id;
private String name;
...
}
在chrome浏览器开发者工具里查看Response:
{
"id":654123883065486500,
"name":"测试商品"
}
其中Long
类型的id
字段值为654123883065486500
,精度发生了丢失,实际值为654123883065486521
。
原因:
JavaScript对数字的处理精度有限,整数部分最多为15位,超过的部分会丢失,并且四舍五入。
可以在chrome的console里测试:
输入:
654123883065486521 返回 654123883065486500
输入:
654123883065486561 返回 654123883065486600
注:如果用postman调接口返回正常。
解决方式:
- 使用jackson的
@JsonSerialize
注解,指定序列化为字符串类型
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
-
在接口返回前,通过工具类方法对需要转换为字符串类型的字段特殊转换处理
-
修改字段类型,
Long
改为String
参考:
- Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题) https://www.cnblogs.com/Fly-Bob/p/7218006.html
- Spring Mvc Long类型传输到前端精度丢失 https://www.jianshu.com/p/b0a628d5cd87
- JS Number 对象的精度问题 https://blog.csdn.net/ren593669257/article/details/89510508
- JS大坑之19位数的Number型精度丢失问题详解 https://www.jb51.net/article/160050.htm
- JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案 https://zhuanlan.zhihu.com/p/65075831
- 【WEB前端】web前端获取的long长整型字段精度丢失问题,解决方案?https://www.cnblogs.com/756623607-zhang/p/13060043.html
- 雪花算法踩坑 - Long 类型 id 返回前端精度丢失 (通过序列化解决)https://blog.csdn.net/YYZZHC999/article/details/106999079
- JPA后台Long类型转json时前端JS获取丢失精度 https://blog.csdn.net/Frankenstein_/article/details/106682570