记一次js长数值类型精度失真导致的问题
需求大概就是后端传给前端一个id,然后前端再使用这个id调接口进行登录
联调过程中发现使用后端传过来的id再去登录的时候竟然登录失败了,查了半天发现前端拿到的id值与系统中查到的并不一致,不同的用户一部分正常,一部分用户id与系统中查到的值相差+2区间内。
查看控制台发现了更诡异的事情:response和preview的值竟然不一样


看到接口返回的是number类型,想着如果把接口返回改成string类型应该就不会出问题了。但是有问题了就得找找原因嘛,查了一通资料下来,原因简单描述就是因为:
JavaScript的Number是双精度浮点数,它可以表示的最大安全范围是正负9007199254740991,也就是2^53-1。 当超出这个数值时,就无法保证准确性了
大概就是number类型的数据,9开头且length超过16位就可能会出问题了。
返回到问题中看,我这个id是17位的长度肯定超出了安全范围,妥妥的不安全了。控制台打印了一下果然是有问题的:

假如以后遇到接口返回字段是number类型,而且值的长度不可保证,最好还是先转为string类型来处理吧。好像有别的骚操作解决方式,不过还是转string最稳妥了