【问题标题】:C libpq: get float value from numericC libpq:从数字中获取浮点值
【发布时间】:2015-09-18 11:35:58
【问题描述】:

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

在 postgres 中有一种专门的浮点类型格式,但我必须使用带有数字字段的现有数据库。我没有在 Postgres 文档中找到有关它的信息,因此感谢您提供的所有信息。

【问题讨论】:

标签: c postgresql floating-point decimal libpq


【解决方案1】:

严格来说,您无法获得numeric 的准确浮点表示。无论如何,都不是任意的numeric

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

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

您的numerics 是numeric(18,15),即精度为 18,小数位数为 15。double precision 有 15-17 个有效数字,具体取决于确切的值。所以你可能会因为四舍五入而丢失数据。

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

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

库包括:

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

Python 具有 decimal.Decimal 类型 (import decimal) 的任意精度小数。 psycopg2 应该可以使用它。因此,您可以考虑将其作为替代方案。

【讨论】:

  • 感谢详细解释!
  • 假设我有来自 PQgetvalue 的 char 指针。我如何理解可以将此指针转换为 C 中的模拟类型以及必须使用附加函数(如 atof)的 postgres 类型?例如,postgres 整数与 postgres 数字。
  • @Sas 这真的是一个单独的话题。如果您无法通过快速搜索自行回答,请发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多