2017-02-20 25 views
-1

Я использовал библиотеку netCDF Python для чтения переменной 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

'decimal' module –

ответ

1

В десятичных вы чеканке являются поддельными. Разница заключается только в том, как эти цифры представлены на вашем экране, а не в том, как они хранятся на вашем компьютере.

Попробуйте сделать следующее, чтобы убедить себя

a = 5449865.55793999997 
a 
# prints 5449865.55794 

Разница между этими двумя числами, если мы возьмем их в буквальном смысле является 3x10^-11. Наименьшая разница: 64-битная переменная с плавающей запятой размером a может решить больше, чем на порядок больше. Таким образом, ваш компьютер не может разделить эти два десятичных числа.

Но посмотрите на яркую сторону. Ваши данные не повреждены каким-то таинственным процессом.

+0

действительно получить правильную точность, можно сделать так: tmp = '{}'. format (переменная [:]. astype (numpy.dtype (decimal.Decimal))) он вернет строку массива и проанализирует ее, чтобы получить значение. –

0

Надежда это то, что соответствует вашим потребностям:

import decimal 

print decimal.Decimal('5449865.55793999997') 
+0

спасибо, но проблема в том, когда я получаю значение элемента: variable [0] он уже возвращен 5449865.55794, то не может использовать decimal(), как в вашем примере. –

+0

Затем назначьте его как список объектов «decimal». т.е. 'data_list = [decmal.Decimal (num) для num in variable]' вместо 'data_list = list (variable)' –