一、问题原因
Java中Long的取值范围为-9223372036854775808到9223372036854775807(即-2^64“ 到”2^64-1)
而JavaScript中的Number取值范围为-9007199254740992 到9007199254740991 (即-2^53 到2^53-1)
二、解决方案
- 在传的时候把Long转换成String类型
- 使用spring的Json解析器时使用@JsonSerialize(using = ToStringSerializer.class) 注解
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
三、 延伸探究
为什么avaScript中的Number取值范围是-2^53 到2^53-1?
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。
Number类型使用的便是其中的双精确度(64位)数据结构如下
Number类型的51-62位为指数位,63位为符号位,所以取值范围是-2^53 到2^53-1