Sas
Sas

Reputation: 563

C libpq: get float value from numeric

I have a table with float value represented using numeric type. How can I get float value from this field using libpq lib?

There is a specialized format for float type in postgres, but I have to work with existing database with numeric fields. I haven't found information about it in the Postgres documentation so every info is appreciated.

Upvotes: 2

Views: 1344

Answers (1)

Craig Ringer
Craig Ringer

Reputation: 324551

Strictly you can't get an accurate float representation of a numeric. Not for any arbitrary numeric anyway.

numeric is arbitrary-precision decimal floating point represented internally as binary-coded decimal strings. It's usually sent to and from the client as a text string of decimal digits.

float/double are fixed-precision binary floating point. They cannot represent all decimal numbers without rounding errors, and they can't represent unlimited precision numbers because they have fixed precision.

Your numerics are numeric(18,15), i.e. precision 18, scale 15. double precision has 15-17 significant digits, depending on the exact value. So you may lose data due to rounding.

If you don't mind that, you can use the usual methods for parsing a floating point value from text, like sscanf, on the textual output of PQgetvalue.

If you need to retain accurate decimal floating point: avoid rounding losses and preserve exact values across round trips, you're going to need to use a decimal floating point library. For any numeric you'd need arbitrary-precision decimal support. For numeric(18,15) you can almost fit it in a IEEE-754:2008 64-bit decimal, but you really need 128-bit decimal to be safe.

Libraries include:

Newer gcc includes support for IEEE-754:2008 floating point too.

Python has arbitrary-precision decimal with the decimal.Decimal type (import decimal). psycopg2 should be able to use this. So you might consider this as an alternative.

Upvotes: 2

Related Questions