最近发现了一个线上问题,用户的信息获取错误。多方调试后发现,我们的userId太长了,超过了js支持的精度范围,发生了精度丢失的问题。 js里面16位就开始丢失精度了,我们的到了17位。
比如一个userId:12345678901234567,在js里,如果使用number类型的话,实际会变成 12345678901234570 。
看到了吗,js自带的坑,而且坑的还不是位数变化,位数没变,但是最后一位四舍五入了!!!
经过各种查资料、咨询、调试、测试……
最后确定,js number 对这个情况无解。
换BigInt long bignumber 之类的,也都没啥乱用。这些类型能解决数学运算的问题,但是我这里并不需要数学运算,只是需要返回给后端,而这些框架对json解析仍然是无解。
最后才是采用了最简单直接、也最有效的办法,把数据类型换成string。
ps:我并不是直接用的js,而是用的ts,然而这门“现代化的语言”,仍然没有解决这个js原始的坑。