2013-04-30 7 views
0

У меня есть сохраненное значение в таблице «.fits» (с этим не должно быть никаких проблем). Я прочитал таблицу и сделатьPython различное значение при печати и чтении

In [2]: a['RA_touse'][0] 
Out[2]: 161.65813 

Это реальная архивируются значение. Однако, тогда я:

In [3]: print a['RA_touse'][0] 
161.658 

Я получаю усеченное значение. Я использую python вместе с POSTGRES, и это поведение дает некоторые проблемы с точностью.

Может ли кто-нибудь объяснить это поведение мне и как его решить? Мне нужно, чтобы мои данные сохранялись в том же формате, но не меняли его (т. Е. Функция repr() превратила бы все в строки).

Большое спасибо!

Редактировать для ясности:

Я использую сценарий питона для создания базы данных. Что я делаю, это

con = psycopg2.connect('todatabase') 
cur = con.cursor() 
for i in vector_of_something: 
    value1 = table['column1'][i] 
    value2 = table['column2'][i] 
    values = (values1,values2) 
    values = [str(value) for value in values] 
    command = 'INSERT INTO table values (%s,%s)' 
    cur.execute(command,values) 
con.commit() 

Проблема заключается в том, что я получаю «161,658» в базе данных в результате, вместо 1.65813.

+2

Какие типы данных вы используете, как в Python, так и в DB? Вы потеряете точность, пытаясь работать с десятичными представлениями для значений с плавающей запятой. Кроме того, есть усечение, которое происходит, когда число отформатировано для печати, что фактически не отражает потерю точности хранимого значения. –

+0

В этом случае я использую поплавки. У меня есть что-то вроде: value = a ['RA_touse'] [0], а затем преобразовать его в строку и загрузить его в postgresql –

+0

После редактирования. Почему вы не храните значения в POSTGRES в виде числовых типов, а не строк? – Shane

ответ

2

Вы должны использовать строковый формат с максимальным количеством десятичных знаков.

print '%.10f' % a['RA_touse'][0] 
+0

Если я это сделаю, я получаю странное значение, например, 161.6581268311.Проблема в том, что значения разные и имеют разные префиксы (они исходят из разных источников), и я хочу сохранить только записанное значение, а не представление. В некоторых случаях это будет 4 десятичных знака, а в других возможно 6. –

+0

Вы пробовали 'print '% f'% a ['RA_touse'] [0]'? – Shane

+0

Вы работаете с числами с плавающей запятой. Они представляются в двоичном виде в системе, а затем преобразуются в/из десятичной для i/o. Значения с плавающей запятой Base 2 не могут представлять точные точные значения, как базовая 10 с плавающей запятой, поэтому, когда значения преобразуются между основами, выполняется процесс аппроксимации. Если вы хотите сохранить точные десятичные значения, используйте что-то вроде 'Decimal'. –

0

При использовании значений с плавающей точкой, вы должны помнить, что вы пишете их в коде или прикладного интерфейса в базе 10 (обычно), но они хранятся в базе 2. Это справедливо для целого значения, но это не проблема, потому что все целые числа могут быть представлены точно в любой базе. Ниже приведены примеры десятичных двоичных преобразований, чтобы показать проблему.

dec bin 
.1 .000110011(0011 repeating) 
.2 .0011(r) 
.25 .01 
.3(r) .01(r) 
.5 .1 

Значения, которые легко представить в базе 10, не всегда даже конечно представима в базе 2. The Decimal object существует специально, чтобы заполнить необходимость поддержания десятичной точности для арифметики с плавающей точкой.

0

Я обнаружил, что проблема заключается в преобразовании строки. В конце концов, я преобразовываю все в строки для форматирования всего для POSTGRESQL. Если я сделаю

values = [repr(vaue) for value in values] 

Выбранное значение верное.

Благодарим за помощь!

+0

У вас все еще будут проблемы с выполнением вычислений с извлеченными значениями, учитывая то, что вы описали как «странные значения» в комментариях к ответу @ Shane. Вы также собираетесь получить удар производительности со всеми преобразованиями строк. –

+0

Hm ... преобразование строки выполняется довольно быстро (таблица заполняется за 10 секунд, имеет> 40000 строк и включает некоторые вычисления). С другой стороны, вы правильно относитесь к вычислениям впоследствии ... похоже, что я не буду использовать Scape с помощью модуля «Десятичный»! –