我有一个使用数字类型表示浮点值的表。如何使用libpq lib从此字段获取浮点值?
postgres中有一个浮点类型的专用格式,但我必须使用数字字段处理现有数据库。我没有在Postgres文档中找到有关它的信息,所以每个信息都很受欢迎。
答案 0 :(得分:1)
严格来说,无法获得numeric
的精确浮点表示。不管怎样,都不是任意numeric
。
numeric
是内部表示为二进制编码的十进制字符串的任意精度十进制浮点数。它通常作为十进制数字的文本字符串发送到客户端和从客户端发送。
float / double是固定精度 二进制浮点数。他们cannot represent all decimal numbers without rounding errors,他们无法表示无限的精确数字,因为它们具有固定的精度。
numeric
为numeric(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
应该能够使用它。所以你可能会认为这是另一种选择。