C libpq:从数字中获取浮点值

时间:2015-09-18 11:35:58

标签: c postgresql floating-point decimal libpq

我有一个使用数字类型表示浮点值的表。如何使用libpq lib从此字段获取浮点值?

postgres中有一个浮点类型的专用格式,但我必须使用数字字段处理现有数据库。我没有在Postgres文档中找到有关它的信息,所以每个信息都很受欢迎。

1 个答案:

答案 0 :(得分:1)

严格来说,无法获得numeric的精确浮点表示。不管怎样,都不是任意numeric

numeric是内部表示为二进制编码的十进制字符串的任意精度十进制浮点数。它通常作为十进制数字的文本字符串发送到客户端和从客户端发送。

float / double是固定精度 二进制浮点数。他们cannot represent all decimal numbers without rounding errors,他们无法表示无限的精确数字,因为它们具有固定的精度。

numericnumeric(18,15),即精度为18,比例为15. double precision有15-17位有效数字,具体取决于具体数值。因此,由于四舍五入,您可能会丢失数据。

如果您不介意,可以使用常用方法在sscanf的文本输出上解析文本中的浮点值,例如PQgetvalue

如果您需要保留准确的十进制浮点数:避免舍入损失并在往返过程中保留精确值,您将需要使用十进制浮点库。对于任何numeric,您需要任意精度的小数支持。对于numeric(18,15),您可以几乎使其符合IEEE-754:2008 64位小数,但您确实需要128位小数才能安全。

图书馆包括:

较新的gcc也包括对IEEE-754:2008浮点的支持。

Python具有decimal.Decimal类型(import decimal)的任意精度十进制数。 psycopg2应该能够使用它。所以你可能会认为这是另一种选择。