C libpq : get float value from numeric

标签 c postgresql floating-point decimal libpq

我有一个表,其中包含使用数字类型表示的浮点值。如何使用 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 位十进制。

库包括:

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

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

关于C libpq : get float value from numeric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651069/

相关文章:

c - 如何将 C 字符串转换为 Rust 字符串并通过 FFI 转换回来?

c - 使用一个结构到另一个结构 c

sql - SQL中根据另一列查找某一列值的最大出现次数

python - psycopg2 和 postgresql 的远程连接问题

floating-point - 使用 double 计算整数 sqrt 的精度

objective-c - 在 Objective C 中将 float 舍入为 1/4

c - C中弹出中间元素

c# - 什么是更好的编码标准 x != null 或 null != x?

node.js - 使用 Sequelize 构建、播种和销毁 PostgreSQL 以进行测试

c - C语言怎么只写小数位?