gpt4 book ai didi

postgresql - 在 Postgresql 中有效地存储带有许多前导零的小数

转载 作者:行者123 更新时间:2023-11-29 12:43:55 24 4
gpt4 key购买 nike

像这样的数字:

0.000000000000000000000000000000000000000123456

在 postgres 中可用的数字类型没有大的性能损失的情况下很难存储。这个 question 解决了一个类似的问题,但我觉得它没有达到可接受的解决方案。目前,我的一位同事将这样的数字四舍五入到小数点后 15 位,并将它们存储为:

0.000000000000001

因此可以使用 double 字类型,从而防止与移动到十进制数字类型相关的惩罚。对于我的目的来说这么小的数字在功能上或多或少是等价的,因为它们都非常小(并且或多或少意味着相同的东西)。然而,我们正在绘制这些结果的图表,当大部分数据集像这样四舍五入时,它看起来非常愚蠢(图表上的平线)。

enter image description here

因为我们要存储数以万计的这些数字并对其进行操作,所以十进制数字类型对我们来说不是一个好的选择,因为性能损失太大。

我是一名科学家,我的自然倾向只是将这些类型的数字存储在科学记数法中,但 postgres 似乎没有这种功能。我实际上不需要数字的所有精度,我只想保留 4 位左右,所以我什至不需要 float 数字类型提供的 15 位数字。 像这样将这些数字存储在两个字段中的优点和缺点是什么:

1.234 (real)
-40 (smallint)

这相当于 1.234*10^-40?这将允许大约 32000 个前导小数,只有 2 个字节用于存储它们,4 个字节用于存储实际值,每个数字总共最多 6 个字节(给我我想要存储的确切数字并且比消耗 8 个字节的现有解决方案)。似乎对这些数字进行排序也会有很大改进,因为您只需要先对 smallint 字段进行排序,然后再对 real 字段进行排序。

最佳答案

您和/或您的同事似乎对使用浮点格式可以表示哪些数字感到困惑。

double (又名 float )数字可以存储至少 15 个有效数字,范围从大约 1e-307 到 1e+308。您必须将其视为科学记数法。删除所有零并将其移动到指数。如果您在科学记数法中拥有的任何内容少于 15 位且指数介于 -307 和 +308 之间,则可以按原样存储。

这意味着 0.0000000000000000000000000000000000000000123456 绝对可以存储为 double ,并且您将保留所有有效数字 (123456)。无需将其四舍五入为 0.000000000000001 或类似值。

float 存在十进制数精确表示的众所周知的问题(因为以 10 为基数的十进制数不一定映射到以 2 为基数的十进制数),但这对您来说可能不是问题(如果您需要能够对这些数字进行精确比较)。

关于postgresql - 在 Postgresql 中有效地存储带有许多前导零的小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35260037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com