数字精度如何影响 JavaScript 的性能,或者会影响性能

How does number precision affect performance in JavaScript, or does it?

本文关键字:性能 影响 精度 或者 JavaScript 何影响 数字      更新时间:2023-09-26

在 JavaScript 中,所有不同类型的数字只有一种类型。所用数字中的小数位数(精度)是否会影响性能,尤其是在 JavaScript 中?如果是这样,如何?

如何在MongoDB中保存数字:精确的数字比不太精确的数字占用更多的空间吗?

一般没有。 当数字不适合 31b 签名 int 时,可能会对性能造成一些影响。

V8 导览:对象表示解释

根据规范,JavaScript 中的所有数字都是 64 位浮点双精度。不过,我们经常使用整数,因此 V8 尽可能用 31 位有符号整数表示数字(低位始终为 0;这有助于垃圾回收器区分数字和指针)。因此,具有快速小整数元素类型的对象仅包含这种类型的数字。如果我们想存储一个小数或更大的整数或像 -0 这样的特殊值,那么我们需要将数组升级到快速双精度。这涉及可能昂贵的复制和转换操作,但在实践中并不经常发生。快速双精度对象仍然非常快,因为所有数字都存储在未装箱的表示形式中。如果我们想存储任何其他类型的值,例如字符串或对象,我们必须升级到快速元素的通用数组。

所用数字中的小数位数(精度)是否会影响性能,尤其是在 JavaScript 中?如果是这样,如何?

不。JavaScript 中的数字类型是以 2 为基数的 64 位浮点值,并且始终具有相同的精度。计算机一点一点地处理这些数据,这些数据是代表像1.0这样对人类来说看起来很简单的东西,还是像123423.5645632这样看似复杂的东西并不重要。事实上,对于以 2 为底的浮点数,"人类"值同样"硬",因为1.1真正由更长的数字表示(如 1.10000000000000054 )。所有这些都无关紧要,因为计算机确实在 64 个 1 和 0 上运行。浮点中总是有一些晦涩难懂的例外,但这些在实践中通常无关紧要。

如何在MongoDB中保存数字:精确的数字比不太精确的数字占用更多的空间吗?

十进制数存储为双精度(64位),无论是1.0还是1.1221234423都无关紧要。同样,这些数据类型的位数是恒定的。

ints也是如此,但MongoDB同时支持32位和64位int。因此,NumberLong确实比常规的 32 位整数大,并且与双精度一样大。