2013-04-30 48 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()函數會將所有內容都轉換爲字符串)。

非常感謝!

編輯爲清楚:

我使用python腳本來創建數據庫。我要做的就是

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和數據庫中使用了哪些數據類型?您將失去使用浮點值的十進制表示的精度。另外,當打印數字格式時會發生截斷,這實際上並不反映存儲值的精度損失。 – 2013-04-30 15:23:33

+0

我在這種情況下使用浮動。我有這樣的:value = a ['RA_touse'] [0]然後將其轉換爲字符串,並將其上傳到postgresql – 2013-04-30 15:24:29

+0

編輯完成後。爲什麼不將數值作爲數字類型存儲在POSTGRES中,而不是字符串? – Shane 2013-04-30 15:39:38

回答

2

您應該使用一個字符串格式,並聲明最大小數點數。

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

如果我這樣做,我會得到一個奇怪的值,如161.6581268311。問題是這些值是不同的,並有不同的精度(他們來自不同的來源),我只想保留記錄的值,而不是表示。在某些情況下,這將是4位小數,其他可能是6. – 2013-04-30 15:28:12

+0

您是否嘗試過'print'%f'%a ['RA_touse'] [0]'? – Shane 2013-04-30 15:30:35

+0

您正在處理浮點數。它們在系統中以二進制表示,然後轉換爲I/O的十進制。基2浮點值不能表示與基10浮點相同的精確值,因此當這些值在基數之間轉換時,會執行一個近似過程。如果你想保留精確的小數值,使用'Decimal'等。 – 2013-04-30 15:31:05

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的答案的評論中給出了你所描述的「奇怪值」時,你仍然會遇到提取值計算問題。所有字符串轉換都會帶來性能提升。 – 2013-04-30 16:00:54

+0

嗯......字符串轉換完成得非常快(表格在10秒內填充,具有> 40000行幷包括一些計算)。另一方面,你之後的計算是正確的......看起來像我不會使用「十進制」模塊來觀察! – 2013-04-30 16:07:17