2017-02-20 25 views
-1

我使用netCDF Python庫讀取具有list(變量)的netCDF變量,如圖像中所示(使用PyCharm IDE)返回正確的小數精度。但是,當我嘗試按索引獲取元素時,例如:variable [0],它會返回四捨五入的值(例如:5449865.55794),而我需要5449865.55793999997。Python以十進制精度迭代列表

enter image description here

我如何可以遍歷該列表以正確的小數精度?

一些基本代碼

from netCDF4 import Dataset 
nc_dataset = Dataset(self.get_file().get_filepath(), "r") 
variable_name = "E" 
// netCDF file contains few variables (axis dimensions) 
variable = nc_dataset.variables[variable_name] 
variable is not a list but a netCDF object, however when using list() or variable[index] will return element value of the axis dimension. 
+1

我們需要[mcve]請 –

+0

我更新了代碼Jean,我不確定這個netCDF庫。 –

+0

'十進制'模塊 –

回答

1

你追小數是僞造的。區別僅在於這些數字在您的屏幕上呈現的方式,而不在於它們如何存儲在您的計算機中。

請嘗試以下說服自己

a = 5449865.55793999997 
a 
# prints 5449865.55794 

兩個數字之間的差異,如果我們把他們從字面上看是3×10^-11。一個大小爲a的64位浮點變量的最小差異可以解決的問題比一個數量級大。所以你的電腦無法區分這兩個十進制數。

但看看光明的一面。你的數據不會被一些神祕的過程所破壞。

+0

實際上爲了得到正確的精度,可以這樣做 tmp ='{}'。format (變量[:]。astype(numpy.dtype(decimal.Decimal))) 它將返回數組的字符串並解析它以獲取值。 –

0

希望這是適合您的需要:

import decimal 

print decimal.Decimal('5449865.55793999997') 
+0

謝謝但是問題是當我得到元素值:變量[0]它已經返回5449865.55794,那麼不能使用decimal(),如你的例子。 –

+0

然後將其分配爲「小數」對象列表。即'data_list = [decal.Decimal(num)for num in variable]'而不是'data_list = list(變量)' –