2015-09-18 3 views
1

У меня есть таблица со значением float, представленная с использованием числового типа. Как я могу получить значение float из этого поля, используя libpq lib?C libpq: get float value from numeric

В postgres существует специальный формат для типа float, но мне нужно работать с существующей базой данных с числовыми полями. Я не нашел информацию об этом в документации Postgres, поэтому вся информация оценивается.

+3

Что вы пробовали? Как работали (или не работали)? С какими проблемами вы столкнулись? –

+0

@Joachim Pileborg Добавлена ​​дополнительная информация – Sas

+1

http://www.postgresql.org/docs/9.3/static/datatype-numeric.html, какой тип? – stark

ответ

1

Строго вы не можете получить точное плавающее представление numeric. Не произвольно numeric в любом случае.

numeric - десятичная плавающая запятая произвольной точности, представленная внутренне как двоично-кодированные десятичные строки. Обычно он отправляется клиенту и из него в виде текстовой строки десятичных цифр.

поплавок/двойные фиксированная точностьдвоичный с плавающей точкой. Они cannot represent all decimal numbers without rounding errors, и они не могут представлять неограниченные числа точности, поскольку они имеют фиксированную точность.

Ваши numeric s являются numeric(18,15), то есть точность 18, шкала 15. double precision имеет 15-17 значащих цифр, в зависимости от точного значения. Таким образом, вы можете потерять данные из-за округления.

Если вы не против, вы можете использовать обычные методы для разбора значения с плавающей запятой из текста, например sscanf, на текстовом выходе PQgetvalue.

Если вам нужно сохранить точную десятичную плавающую точку: избегайте округления потерь и сохраняйте точные значения в круглых поездках, вам понадобится использовать десятичную библиотеку с плавающей запятой. Для любого numeric вам понадобится десятичная поддержка с произвольной точностью. Для numeric(18,15) вы можете почти установить его в 64-разрядный десятичный код IEEE-754: 2008, но вам действительно нужно 128-битное десятичное число, чтобы быть в безопасности.

Библиотеки включают в себя:

Новый gcc включает поддержку плавающей запятой IEEE-754: 2008.

Python имеет произвольно-прецизионное десятичное значение с типом decimal.Decimal (import decimal). psycopg2 должен иметь возможность использовать это. Таким образом, вы можете рассмотреть это как альтернативу.

+0

Спасибо за подробное объяснение! – Sas

+0

Предположим, у меня есть указатель char из PQgetvalue. Как я могу понять, для какого типа postgres я могу наложить этот указатель на аналоговый тип в C и для которого я должен использовать дополнительные функции (например, atof)? Например, postgres integer или postgres numeric. – Sas

+0

@Sas Это действительно отдельная тема. Пожалуйста, задайте новый вопрос, если вы не можете ответить на него с помощью быстрого поиска. –