Проблемы с округлением поплавков в Python - PullRequest
7 голосов
/ 31 августа 2011

У меня проблема с np.round, np.around, где он не округляется должным образом.Я не могу включить код, потому что когда я делаю это вручную, устанавливаю значение (в отличие от использования моих данных), возвращение работает, но вот вывод:

In [177]: a
Out[177]: 0.0099999998

In [178]: np.round(a,2)
Out[178]: 0.0099999998


In [179]: np.round(a,1)
Out[179]: 0.0

Чего мне не хватает?Тип d для float32, мне нужно изменить это?

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Попробуйте создать np.float32(0.01), и вы увидите свой ответ. Вы получаете точность, которую вы уже можете.

>>> import numpy as np
>>> x = 0.01
>>> epsilon = 0.01 - np.float32(0.01)
>>> for n in np.arange(x - 10*epsilon, x + 10*epsilon, epsilon):
...     print(repr(np.float32(n)))
...     
0.0099999979
0.0099999979
0.0099999979
0.0099999988
0.0099999988
0.0099999988
0.0099999988
0.0099999998
0.0099999998
0.0099999998
0.0099999998
0.0099999998
0.010000001
0.010000001
0.010000001
0.010000001
0.010000002
0.010000002
0.010000002
0.010000002
2 голосов
/ 15 июня 2017

Обратите внимание, что, похоже, проблема с функциями round и 10000 * в Python. Смотрите пример ниже:

In [88]: round(np.float64(16.259766999999947), 4)
Out[88]: 16.259799999999998

Единственный способ исправить это - преобразовать numpy.float64 в число с плавающей точкой, прежде чем использовать функцию округления, как показано ниже:

In [89]: round(float(np.float64(16.259766999999947)), 4)
Out[89]: 16.2598
...