2017-02-20 40 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(变量)' –