Long 在JS中丢失精度的坑

在做一个需求时,ID是通过snowflake算法生成的一个64位bit的长整型;但是在使用的时候踩入到了一个JS的坑!通过分享希望大家以后可以避免这样的问题。

 在进行自测的时候搜索结果中有如下这样一条数据,在对其进行编辑操作时,提示“场次不存在”,根据ID去数据库中查询,确实没有该条数据;为什么出现这样的问题呢?


    
在浏览器的Preview中查看返回的结果中确实是这样的数据,但是在Response中看到的却是27112396359241728 这个是什么原因导致的呢?经过测试发现,这个问题是由于JS number的精度问题导致的。在JS中Number类型统一按浮点数处理,64位存储,整数是按最大54位来算最大最小数的,否则会丧失精度;某些操作(如数组索引还有位操作)是按32位处理的~~

    

在很多系统中的主键都是使用Long,但是通过这样的一个坑可以发现使用Long还是存在一定风险的,需要对27112396359241728进行操作可是实际上操作了27112396359241730!可以将ID改为字符串类型,就可以避免该问题。

本文来自网易实践者社区,经作者张伟授权发布。