MongoDB Shell中NumberLong(9007199254740993)为何与NumberLong(9007199254740992)匹配?
关于大数值下NumberLong匹配异常的问题
这其实是JavaScript(以及很多依赖双精度浮点数的环境)的精度限制引发的问题,当数值超过9007199254740992(也就是2^53,这是双精度浮点数能精确表示的最大整数)时,就会出现你遇到的情况:
- 不止
NumberLong(9007199254740996)会匹配NumberLong("9007199254740996"),相邻的NumberLong(9007199254740995)和NumberLong(9007199254740997)也会匹配同一个值 - 这种情况会直接导致业务上的麻烦:当你想要通过数值操作某条特定记录时,用三个不同的相邻数值居然都能获取到同一条记录
背后的原因很直观:双精度浮点数的有效存储位数只有53位,超过这个范围后,连续的整数无法被精确区分——多个相邻整数会被映射成同一个浮点数。而MongoDB的NumberLong类型在和JavaScript数值交互时,就会触发这种精度丢失导致的匹配异常。
内容的提问来源于stack exchange,提问作者Minix Li
相关产品推荐
相关产品推荐

