在使用 NumberLong
时,直接传递一个数字作为参数的做法已经被视为过时(deprecated),并且这样做可能导致精度丢失。这是因为 JavaScript 的数字类型是基于 IEEE 754 标准的双精度浮点数,它可以精确表示的最大整数是 (2^{53} - 1) (即 9007199254740991)。对于超出这个范围的整数,JavaScript 可能无法准确表示,从而导致精度损失。
为了避免这种情况,MongoDB 建议在创建 NumberLong
实例时,将大整数以字符串的形式传递给 NumberLong
构造函数。这样可以确保无论数值多大,都能保持其原始精度。
例如,正确的做法应该是这样的:
// 不推荐的方式,可能会导致精度丢失
var num = new NumberLong(9223372036854775807);
// 推荐的方式,避免精度丢失
var num = new NumberLong("9223372036854775807");
通过这种方式,可以确保在使用 NumberLong
表示大整数时不会遇到精度问题。