【问题标题】:Python iterate the list with decimal precisionPython以十进制精度迭代列表
【发布时间】:2017-07-09 11:35:06
【问题描述】:

我使用 netCDF Python 库读取具有 list(variable) 的 netCDF 变量返回正确的十进制精度,如图像中所示(使用 PyCharm IDE)。但是,当我尝试按索引获取元素时,例如:变量 [0],它会返回舍入值(例如:5449865.55794),而我需要 5449865.55793999997。

如何以正确的小数精度迭代此列表?

一些基本代码

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.

【问题讨论】:

  • 我更新了代码 Jean,不过我不确定这个 netCDF 库。
  • 你能提供更多细节吗,克里斯?

标签: python python-2.7 numpy pycharm


【解决方案1】:

你追逐的小数是假的。不同之处仅在于这些数字在屏幕上的显示方式,而不在于它们在计算机中的存储方式。

尝试以下方法说服自己

a = 5449865.55793999997
a
# prints 5449865.55794

如果我们从字面上理解这两个数字之间的差异是 3x10^-11。 a 大小的 64 位浮点变量可以解决的最小差异大于一个数量级以上。所以您的计算机无法区分这两个十进制数。

但是看看光明的一面。您的数据没有被一些神秘的过程破坏。

【讨论】:

  • 实际上要获得正确的精度,可以这样做 tmp = '{}'.format(variable[:].astype(numpy.dtype(decimal.Decimal))) 它会返回字符串数组并解析它以获取值。
【解决方案2】:

希望这能满足您的需求:

import decimal

print decimal.Decimal('5449865.55793999997')

【讨论】:

  • 谢谢,但问题是当我得到元素值时:variable[0] 它已经返回 5449865.55794,然后不能像你的例子那样使用 decimal()。
  • 然后将其分配为decimal 对象的列表。即data_list=[decmal.Decimal(num) for num in variable] 而不是data_list=list(variable)
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
相关资源
最近更新 更多