2013-04-30 3 views
0

".fits"테이블에 저장된 값이 있습니다 (이 문제는 없어야 함). 나는 테이블을 읽고,이 실제 보관 된 값입니다인쇄 및 읽기시 Python의 다른 값

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

을한다. 그러나 다음을 수행합니다.

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

잘린 값이 표시됩니다. 나는 POSTGRES와 함께 python을 사용하고 있는데,이 동작은 정밀도에 문제가있다.

아무도 나 에게이 동작을 설명하고, 어떻게 해결할 수 있을까요? 내 데이터를 변경하지 않고 같은 형식으로 유지해야합니다 (즉, 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() 

문제는 내가 대신 1.65813의, 결과로 데이터베이스에 "161.658"얻을입니다.

+2

파이썬과 DB 모두 어떤 데이터 유형을 사용하고 있습니까? 부동 소수점 값에 대한 10 진수 표현을 사용하려고하면 정밀도가 떨어집니다. 또한 저장된 값의 정밀도 손실을 실제로 반영하지 않는 인쇄용 숫자의 서식을 지정할 때 발생하는 잘림이 있습니다. –

+0

이 경우에는 수레를 사용하고 있습니다. 나는 다음과 같은 것을 가지고있다. value = a [ 'RA_touse'] [0] 문자열로 변환하고, postgresql에 업로드한다. –

+0

편집 후. POSTGRES에 값을 String이 아닌 숫자 형으로 저장하지 않는 이유는 무엇입니까? – Shane

답변

2

최대 소수점이 표시된 문자열 형식을 사용해야합니다. 당신은 부동 소수점 값을 사용하는 경우

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

이렇게하면 161.6581268311과 같은 이상한 값을 얻게됩니다.문제는 값이 다르며 서로 다른 정밀도 (서로 다른 소스에서 제공됨)가 있으며 표현이 아니라 기록 된 값만 유지하려고합니다. 어떤 경우에는 4 소수 자릿수가 될 수도 있고 다른 수는 6이 될 수도 있습니다. –

+0

% print % {% a ''RA_touse '[0]'? – Shane

+0

부동 소수점 숫자로 작업하고 있습니다. 그것들은 시스템에서 이진수로 표현되고, 그 다음에 /에서 십진수로 변환됩니다. 기본 2 부동 소수점 값은 기본 10 부동 소수점과 동일한 정확한 값을 나타낼 수 없으므로 값이 기준 사이에서 변환 될 때 근사 처리가 수행됩니다. 정확한 십진수 값을 유지하려면 'Decimal'과 같은 것을 사용하십시오. –

0

, 당신은 기본 10 (보통)의 코드 또는 응용 프로그램 인터페이스를 작성하는 것을 기억해야하지만, 그들은 기지 (2)에 저장되고이 정수 마찬가지입니다 값은 물론 모든 정수가 어떤 기준에서도 정확하게 나타낼 수 있기 때문에 문제가되지 않습니다. 몇 가지 10 진수> 이진 변환 예제는 문제를 보여줍니다. 베이스 10에 표현하기 쉬운

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

값은 2 The Decimal object는 소수점 연산을 부동 소수점 정밀도를 유지의 필요를 채우기 위해 특별히 존재에도 항상 유한 한 표현 가능한 자료 수 없습니다.

0

문제가 문자열 변환이라는 것을 알았습니다. 결국 POSTGRESQL의 모든 것을 포맷하기 위해 모든 것을 문자열로 변환합니다. 내가한다면

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

업로드 된 값이 정확합니다.

도움 주셔서 감사합니다.

+0

@ Shane의 답변에 대한 설명에서 "이상한 값"으로 설명한 내용을 바탕으로 추출 된 값으로 계산을 실행하는 데 여전히 문제가 있습니다. 또한 모든 문자열 변환으로 실적이 저하 될 것입니다. –

+0

흠 ... 문자열 변환이 매우 빠릅니다 (표가 10 초 내에 채워지고> 40000 행을 가지며 일부 계산 포함). 반면에, 당신은 나중에 계산에 대해 옳습니다 ... 나는 "십진법"모듈을 사용하여 풍경을 보지 못했던 것처럼 보입니다! –