Строго вы не можете получить точное плавающее представление 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
должен иметь возможность использовать это. Таким образом, вы можете рассмотреть это как альтернативу.
Что вы пробовали? Как работали (или не работали)? С какими проблемами вы столкнулись? –
@Joachim Pileborg Добавлена дополнительная информация – Sas
http://www.postgresql.org/docs/9.3/static/datatype-numeric.html, какой тип? – stark