javascript在数字比较大情况下,使用JSON.stringify()JSON.parse()JSON序列化为字符串与反序列化js可理解的数据结构时,会出现数据失真问题。

如图所示:

image-20210624004930414

1.这是为什么?

javascript没有整形、浮点型,只有number类型表示数字。而number类型根据IEEE754规定,能安全表示的数字范围 $$ -(2^{53}-1) 到(2^{53}-1) $$ 而雪花算法生成的ID是int64,在后端,int64表示的范围 $$ -(2^{63}-1) 到(2^{63}-1) $$ 所以如果后端碰巧给前端的值很大,超过前端number能够表示的范围,前端收到的值就会失真,始终无法获得正确的ID。

2.怎么解决?

这个问题在很多后端语言和前端对接过程中,都会存在,毕竟我们身处于一个大前端的洪流之中,任尔后端72变,前端岿然不动。

解决方案:使用字符串在前后端传递

type UserInfo struct{
    UserId int64 `json:"userID,string"`
} 

Golang有比较方便的方法:为其tag增加string

  • 这样在前端请求后端后,反序列化时,就会把前端字符串反序列化成int64
  • 后端返回前端前,序列化时,把int64序列化为字符串,给到前端;