我有一个表,其中包含使用数字类型表示的浮点值。如何使用 libpq lib 从此字段获取浮点值?
postgres 中有一种专门用于浮点类型的格式,但我必须使用带有数字字段的现有数据库。我没有在 Postgres 文档中找到有关它的信息,因此非常感谢每个信息。
最佳答案
严格来说,您无法获得数字
的准确浮点表示。无论如何,不适用于任何任意数字
。
numeric
是任意精度的十进制浮点,内部表示为二进制编码的十进制字符串。它通常作为十进制数字的文本字符串发送到客户端或从客户端发送。
float/double 是固定精度二进制浮点。他们cannot represent all decimal numbers without rounding errors ,并且它们不能表示无限精度的数字,因为它们具有固定的精度。
您的数字
是数字(18,15)
,即精度18,小数位数15。 double
有15-17位有效数字,取决于具体值。因此,您可能会因舍入而丢失数据。
如果您不介意,您可以在 PQgetvalue
的文本输出上使用从文本解析浮点值的常用方法,例如 sscanf
。
如果您需要保留精确的十进制浮点:避免舍入损失并在往返过程中保留精确值,您将需要使用十进制浮点库。对于任何数字
,您需要任意精度的十进制支持。对于numeric(18,15)
,您几乎可以将其放入 IEEE-754:2008 64 位十进制中,但为了安全起见,您确实需要 128 位十进制。
库包括:
- Intel's Decimal Floating Point library
- IBM 的十进制浮点库
- GNU MFPR - 任意精度
- decNumber
- libmpdec - 任意精度
较新的 gcc 也包括对 IEEE-754:2008 浮点的支持。
Python 具有 decimal.Decimal
类型的任意精度小数(importdecimal
)。 psycopg2
应该能够使用它。因此,您可以考虑将其作为替代方案。
关于C libpq : get float value from numeric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651069/