向前端传递Long类型数据时,数据精度丢失问题

335 阅读1分钟

一、问题

数据库表的id为bigint,java为Long。前端接收数据,id应该是11284058870255617但是前端接收到的是11284058870255616。

二、原因

在 JavaScript 中,所有数字都以 64 位浮点格式(IEEE 754 标准)存储。

根据此标准,大整数无法被精确表示,会被四舍五入。

因此,JavaScript 只能安全地表示以下范围内的整数:

  • 最大为 9007199254740991(253-1)
  • 最小为 -9007199254740991(-(253-1))

超出此范围的整数值会失去精度。

JavaScript 整数最多只能精确到 15 位

三、解决办法

解决办法:将Long类型的字段转为String类型返给前端

方法一、在要返回的字段上添加@JsonSerialize(using = ToStringSerializer.class)注解,这样就能在序列化时自动将该字段类型转为String类型返给前端

图片.png

方法二、在ymlproperties中增加配置

spring:
  jackson:
    generator:
      write_numbers_as_strings: true