在JavaScript中,所有不同类型的数字只有一种类型。使用的数字中的小数位数(精度)是否会影响性能,尤其是在JavaScript中?如果有,怎么样?
如何在MongoDB中保存数字:精确数字是否比不太精确的数字占用更多空间?
答案 0 :(得分:1)
一般没有。当一个数字不适合31b signed int时,会有一些可能的性能影响。
A tour of V8: object representation解释
根据规范,JavaScript中的所有数字都是64位浮点数。我们经常使用整数,因此V8尽可能表示带有31位有符号整数的数字(低位始终为0;这有助于垃圾收集器区分数字与指针)。因此具有快速小整数元素类型的对象仅包含此类型的数字。 如果我们想要存储小数或更大的整数或特殊值(如-0),那么我们需要将数组升级为fast double。这涉及可能昂贵的复制和转换操作,但在实践中并不经常发生。快速双打对象仍然非常快,因为所有数字都存储在未装箱的表示中。如果我们想要存储任何其他类型的值,例如字符串或对象,我们必须升级到一般数组快速元素。
答案 1 :(得分:0)
使用的数字中的小数位数(精度)是否会影响性能,尤其是在JavaScript中?如果有,怎么样?
没有。 JavaScript中的数字类型是一个64位浮点值,其基数为2,并且始终具有相同的精度。计算机一点一点地处理这些数据,这些数据是否代表像1.0
这样的人类看似简单的东西或像123423.5645632
那样看似复杂的东西并不重要。事实上,对于基地2花车,人类'价值就像“硬”一样,因为1.1
真的由更长的数字表示(如1.10000000000000054
)。所有这些都无关紧要,因为计算机真正运行64个零和0。在浮点数中总会有一些神秘的例外,但那些通常在实践中并不重要。
如何在MongoDB中保存数字:精确数字是否比不太精确的数字占用更多空间?
十进制数字存储为双精度数(64位),无论是1.0
还是1.1221234423
都无关紧要。同样,这些数据类型的位数是恒定的。
对于int来说也是如此,但MongoDB支持32位和64位整数。所以NumberLong
确实比常规的32位整数大,并且与双精度一样大。