说明:后端返回的接口中id是通过雪花算法生成的18位数字,直接返回前端。前端显示将16位之后用00表示。
分析:在 JavaScript 中,数值类型默认会被转换为双精度浮点数,而双精度浮点数的精度有限,只能精确表示 2 的 53 次方以内(即 Number.MAX_SAFE_INTEGER,约为 9 x 10^15)的整数。对于超过该范围的长整数,JavaScript 会发生精度丢失,导致值变得不准确。
解决:
- 将后端的id列转化成字符串,通过在id属性增加注解@JsonFormat(shape = JsonFormat.Shape.STRING)解决(推荐:因为改动小)
- springboot项目,全局配置将所有输出给前端的数字类型转化成字符串。spring.jackson.seralization.WRITE_NUMBER_AS_STRINGS=true解决(不推荐,其他字段理论上不需要转化)
- 前端处理,如引入第三方库number.js或者使用原生的bigInt(),不过这两种测试都仍然存在丢失精度的问题(有待观察)
