1、业务背景
调用接口返回数据实体,id是long类型,浏览器(谷歌)进行访问返回的id最后两位变成0了,精度丢失。但是通过postman是正常的。
2、问题分析
这是因为在 JavaScript 中,数字类型默认会被转换为双精度浮点数,而双精度浮点数的精度有限,只能精确表示 2 的 53 次方以内(即 Number.MAX_SAFE_INTEGER,约为 9 x 10^15)的整数。对于超过该范围的长整数,JavaScript 会发生精度丢失,导致值变得不准确(前端JavaScript最大只能接收16位数字)。
3、问题验证
打开浏览器,按F12调出控制台,在控制台中输入 console.log(9223372036854775807) ,打印的结果与传入的参数不一致
4、解决方案
方法一,在属性上添加注解:@JsonSerialize(using = ToStringSerializer.class),将数值转换为字符串
/**
* 用户ID
*/
@JsonSerialize(using = ToStringSerializer.class)
@Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")