【问题标题】:How do you store a googol in the database (and other very large numbers)?您如何将 googol 存储在数据库中(以及其他非常大的数字)?
【发布时间】:2012-06-05 11:07:17
【问题描述】:

您如何有效地存储从 10^-10010^100 的非常大和非常小的数字,以便您可以使用它们在 JavaScript 等编程语言中计算值。

JavaScript 将10^100 存储为1e+101,有没有办法在数据库中做到这一点?这些数字通常不会那么大,但我想用 10^-34 * 2^16 之类的数据进行计算,所以数据库应该(我认为)将这些存储为数字......

这是如何工作的?您如何存储这种规模的数字以便您可以使用它们进行计算?

通过“数据库”,我在想一般。我目前正在玩弄 MongoDB 和 Neo4j。

【问题讨论】:

  • 对于大数字,将它们存储为字符串。有用于大数字的 javascript 库,例如用于整数的 bigInt

标签: javascript database numbers


【解决方案1】:

数据库本身不支持原生数字格式的任意大小的数字。您对数字类型的一般上限通常是 8 个字节,这与 googol 相差无几。

您必须将数字存储为字符串(效率最低,最容易使用,可以根据需要尽可能精确),任意长度的字节数组(更高效,更难使用,仍然是任意的精度)或科学记数法(最有效、更难使用且精度有限)。

不幸的是,前两个确实消除了进行任何服务器端计算的可能性,因为不存在可以支持有效值范围的本机数字类型。所有计算都必须使用合适的数字类型在客户端完成。

【讨论】:

  • 为什么说科学记数法的精度有限?当然可以存储 1.2345LotsOfDigits89E1000SomeBigNumber00042。如果你真的需要那种精度,空间效率不是很高,但通常如果你测量一个 googol 的数量级的东西,你不会太在意 1 的位置。
  • 因为这是真的。科学记数法本身显然可以将数字存储到任意精度,但它的重点是使用较小的数字提供大数字的近似值。是有损压缩。大小、精度、域;你可以选择两个。 OP 可能确实不需要那种级别的精度,在这种情况下,科学记数法肯定是合适的。我不知道,这就是为什么我在答案中这么说。
  • 您是在谈论科学记数法的某些特定机器表示,还是一般的记数法?该符号通常允许 1 到 10 之间任意精度的数字,以及任意指数。
  • @EricJ.:机器表示,因为这是相关点。如果数据库不能存储任意大的数字,那么科学计数法也不例外。
  • MongoDB 或 Neo4j 是否有原生的“科学记数法”格式?
【解决方案2】:

如果我是你,我会将数值与指数分开。我个人没有使用 MongoDB 或 Neo4j 的经验,但是在 MySQL 中(我确信它们有类似的术语)我会创建一个带有 VARCHAR(文本)列的表,该列具有您在程序中想要的任何精度(或有多少个唯一数字)和另一个长度为 3 的 VARCHAR 列(对于最大指数 999)。你可以修改你认为合适的值,但这就是我能想到的。如果您想要更灵活的大小值,我会使用 PHP 将数字存储在服​​务器的文件系统上,而不是使用数据库。

【讨论】:

  • 虽然这似乎是一个很好的方法,但您基本上需要再次重新实现整个浮点标准。而且我相信编写底层编程语言/算术库的人在这方面比你或我要好得多。
  • 是的...好点。现在我想起来,这可能需要比我说的更多的工作。
  • 更多的工作可能是今年的轻描淡写。有一个可定制的精度十进制算术标准(speleotrove.com/decimal),这并不简单也不容易
【解决方案3】:

你可以使用 double 类型。

The MySQL DOUBLE[(M,D)]

一个正常大小(双精度)的浮点数。允许的 值为 -1.7976931348623157E+308 到 -2.2250738585072014E-308, 0, 和 2.2250738585072014E-308 到 1.7976931348623157E+308。这些是 理论限制,基于 IEEE 标准。实际范围可能 根据您的硬件或操作系统,稍微小一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2013-10-13
    • 2010-11-08
    • 2019-11-12
    • 2021-09-19
    相关资源
    最近更新 更多