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

У меня возникла ситуация, когда классическая ошибка представления в 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 или что-то еще …) и только округлите или усекайте вещи при презентации.

  • Alexa запрашивает подтверждение в python
  • Использование QProcess.finished () в Python 3 и PyQt
  • Логика относительно использования пространств с унарными операторами в Python3
  • Как создать цикл событий с некоторыми сопрограммами, выполняемыми навсегда?
  • Преобразование int в байты в Python 3
  • python: использование вывода класса метода внутри другого класса
  • Что означает печать (... sep = '', '\ t')?
  • Anaconda - установить blpapi в среде
  • Python - лучший язык программирования в мире.