Округление в python

Полезные методы Decimal

Итак, вот некоторые полезные методы для работы с десятичными числами в Decimal:

  • – вычисляет квадратный корень из десятичного числа;
  • – возвращает e^x (показатель степени) десятичного числа;
  • – используется для вычисления натурального логарифма десятичного числа;
  • – используется для вычисления log (основание 10) десятичного числа;
  • – возвращает десятичное число, содержащее 3 аргумента, знак (0 для +, 1 для -), цифры и значение экспоненты;
  • fma(a, b) – «fma» означает сложить, умножить и добавить. Данный метод вычисляет из чисел в аргументе. В этой функции округление не выполняется;
  • – печатает первый аргумент, копируя знак из второго аргумента.

Полный список методов Decimal описан в

Ошибки округления и модуль decimal

При округлении функцией round(), можно получить следующее:

round(2.65, 1) # = 2.6
round(2.85, 1) # = 2.9

Почему в одном случае округляется вниз, а в другом вверх? При переводе 2.85 в двоичную систему получается число, которое немного больше. Поэтому функция видит не «5», а «>5» и округляет вверх.

Проблему неточного представления чисел отлично иллюстрирует пример:

print (0.1 + 0.1 + 0.1)

0.30000000000000004

Из-за подобных ошибок числа типа «float» нельзя использовать там, где изменения значения на одну тысячную может привести к неверному результату. Решить данную проблему поможет модуль decimal.

decimal — модуль, позволяющий округлять десятичные дроби с почти 100% точностью. Его основной принцип: компьютер должен считать так, как считает человек. Речь идёт не о скорости вычисления, а о точности и отсутствии проблем неправильного представления чисел.

Банковское округление в round()

Банковское (или бухгалтерское) округление позволяет уменьшить погрешности при работе с большим массивом данных. Обычное (или арифметическое) округление даёт нарастающую погрешность из-за того, что для округления в меньшую сторону на конце должны быть цифры: 1, 2, 3, 4 — всего 4 цифр, а в большую: 5, 6, 7, 8, 9 — всего 5 цифр. Неравное количество цифр при большом количестве вычислений и вызывают нарастающую погрешность.
При банковском округлении осуществляется округление к ближайшему чётному, то есть , . Таким образом вероятность того, что перед пятёркой окажется чётное или нечётное число для большинства случаев (к примеру, бухгалтерские расчёты) примерно одинаковая, поэтому такой принцип уменьшает погрешность.

Здесь вы можете увидеть подробности округления в официальных источниках документации python:

«if two multiples are equally close, rounding is done toward the even choice» (перев.: Округление делается до ближайшего четного) — это и есть банковское округление.

Но напоследок приведу пример, наглядно демонстрирующий разницу работы функции round() в различных версиях python и с учётом неточности представления типа :

Пример round() в python 2 round() в python 3 банковское округление
round(2.05, 1) 2.0 2.0 2.0
round(2.15, 1) 2.1 2.1 2.2
round(2.25, 1) 2.3 2.2 2.2
round(2.35, 1) 2.4 2.4 2.4
round(2.45, 1) 2.5 2.5 2.4
round(2.55, 1) 2.5 2.5 2.6
round(2.65, 1) 2.6 2.6 2.6
round(2.75, 1) 2.8 2.8 2.8
round(2.85, 1) 2.9 2.9 2.8
round(2.95, 1) 3.0 3.0 3.0

Жирным выделил отличающиеся значения выполнения функции round().

Казалось бы в примере с результат для python 3 должен быть , потому как python 3 работает по банковскому округлению, но правильное значение , так как значение в машинном представлении не точное и выглядит для, к примеру, 60 знаков после запятой следующим образом:

>>> '%0.60f' % 2.15
'2.149999999999999911182158029987476766109466552734375000000000'

Отсюда видно, что по правилам обычного арифметического округления получаем .

Но для примера 60 знаков после запятой выглядят следующим образом:

>>> '%0.60f' % 2.25
'2.250000000000000000000000000000000000000000000000000000000000'

Вот здесь-то и возникает спорный момент по способу округления. Так для python 2 получаем  — арифметическое округление.

А для python 3 получаем , что соответствует правилам банковского округления.

Материалы по теме:

Округление (Википедия)

Автор статьи

Права на использование материала, расположенного на этой странице https://vivazzi.pro/it/round-python/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра в теге . Использование:

Автор статьи: Мальцев АртёмСсылка на статью: <a href="https://vivazzi.pro/it/round-python/">https://vivazzi.pro/it/round-python/</a>

Предыдущая статьяПример обработки formset

Следующая статьяsql перенос данных из одной таблицы в другую

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.

Посмотреть рекомендации

Ознакомьтесь с реально работающими финансовыми инструментами

Wall Street Cash — Торговый робот на рынке Forex

Ознакомьтесь с роботом (советником), который автоматизирует торговлю на валютном рынке Forex без необходимости самому торговать. Преимущество робота в том, что вы сами контролируете свой счёт, а робот лишь по оптимизированным алгоритмам заключает сделки на куплю и продажу валют.

Подробнее о Wall Street Cash

Viva TM — Доверительное управление с использованием робота WSC

Доверительное управление Viva TM — это разработанный мной сервис по управлению вашими денежными средствами и заработку на рынке Форекс с использованием торгового робота Wall Street Cash.
Возможность использовать моё доверительное управление подходит тем, кто не хочет или не может самостоятельно настроить робота.

Подробнее о Viva TM

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *