Округление поплавков с ошибкой представления до ближайшего и правильного результата

У меня возникла ситуация, когда классическая ошибка представления в Python стала проблемой: мне нужно, чтобы они использовались для операций Matrix в Numpy, а десятичный тип еще не поддерживается.

Вы все знаете, что если я сделаю 111.85 * 111.85 я получу 12510.422499999999 но если я round(12510.422499999999, 4) я могу получить правильный результат, который, конечно, 12510.4225 .

Но актуальные вопросы:

  • Является ли этот круглый материал хорошей идеей и хорошей практикой?
  • Будет ли это работать во всех случаях? иногда в десятичной запятой, где десятичные числа ..999 могут быть больше
  • И, наконец, Как получить подходящее количество десятичных позиций для использования с раундом для всех возможных значений?

2 Solutions collect form web for “Округление поплавков с ошибкой представления до ближайшего и правильного результата”

Даже если вы округлите число, десятичное значение будет не таким , каким вы ожидаете. Python может отображать только самые значащие биты, но нижележащая десятичная неточность все еще существует.

Документы python посвящают ему раздел

Многие пользователи не знают о приближении из-за способа отображения значений. Python только печатает десятичное приближение к истинному десятичному значению двоичного приближения, хранящегося на машине. На большинстве машин, если бы Python должен был напечатать истинное десятичное значение бинарного аппроксимации, сохраненного для 0,1, ему пришлось бы отображать

 >>> 0.1 0.1000000000000000055511151231257827021181583404541015625 

Это больше цифр, чем большинство людей находят полезным, поэтому Python сохраняет количество цифр, управляемых, показывая округленное значение

 >>> 1 / 10 0.1 

Для большинства случаев использования неточность можно смело игнорировать. Если вы имеете дело с чрезвычайно маленькими или чрезвычайно большими числами или нуждаетесь в точности во многих десятичных разрядах, вы можете использовать десятичную библиотеку

  >>> Decimal('111.85') * Decimal('111.85') Decimal('12510.4225') 

Реальная проблема здесь заключается в том, чтобы определить, как ошибка представления может стать проблемой в первую очередь.

Вы не должны использовать представление для удобочитаемой печати поплавков, вы должны использовать, например, str.format или какой-либо другой метод представления.

Храните ваши номера в виде чисел для всех вычислений (независимо от того, делаете ли вы это с помощью поплавков или Decimals или что-то еще …) и только округлите или усекайте вещи при презентации.

  • `xrange (2 ** 100)` -> OverflowError: long int too large для преобразования в int
  • Когда следует использовать память?
  • Я хочу использовать NumPy / SciPy. Должен ли я использовать Python 2 или 3?
  • Почему Python 3 изменился на exec, нарушив этот код?
  • Использование hashlib для вычисления md5 digest файла в Python 3
  • Python, TypeError: unhashable type: 'list'
  • что делает `super ()` в `__new__`
  • Как использовать python 3 в качестве скрипта сборки в конфигурации не-python travis?
  • Какова форма функции импорта звезды в Python 3
  • Установка NLTK со Стэнфордским НЛП (как StanfordNERTagger, так и StanfordPOSTagger) для испанского
  • Странные символы при чтении содержимого файла
  • Python - лучший язык программирования в мире.