Как округлить числа в Python
Это эра больших данных, и каждый день все больше и больше предприятий пытаются использовать свои данные для принятия обоснованных решений. Многие компании обращаются к мощной экосистеме данных Python для анализа своих данных, о чем свидетельствует растущая популярность Python в области наук о данных.
Одна вещь, которую должен помнить каждый специалист по науке о данных, — как набор данных может быть предвзятым Делая выводы из предвзятых данных может привести к дорогостоящим ошибкам.
Есть много способов, которыми смещение может заползти в набор данных. Если вы изучали некоторые статистические данные, вы, вероятно, знакомы с такими терминами, как смещение отчетности, смещение выбора и смещение выборки. Существует еще один тип смещения, который играет важную роль при работе с числовыми данными: смещение округления.
В этой статье вы узнаете:
Почему способ округления чисел важен
Как округлить число согласно различным стратегиям округления и как реализовать каждый метод в чистом Python
Как округление влияет на данные, и какая стратегия округления минимизирует этот эффект
Как округлить числа в массивах NumPy и Pandas DataFrames
Когда применять разные стратегии округления
Эта статья не является трактатом о числовой точности вычислений, хотя мы кратко коснемся этой темы. Необходимо только знакомство с основами Python, и математика, которая здесь используется, должна быть удобной для любого, кто знаком с эквивалентом алгебры средней школы.
Давайте начнем с рассмотрения встроенного в Python механизма округления.
Встроенная функция Python + round () +
Python имеет встроенную функцию + round () + , которая принимает два числовых аргумента, + n + и + ndigits + , и возвращает число + n + , округленное до + ndigits + . Аргумент + ndigits + по умолчанию равен нулю, поэтому, если его опустить, число округляется до целого числа. Как вы увидите, + round () + может работать не совсем так, как вы ожидаете.
То, как большинство людей учат округлять число, выглядит примерно так:
_ _ Округлите число + n + до + p + десятичных разрядов, сначала сместив десятичную точку в + n + на + p + мест, умножив + n + на 10ᵖ (10 повышается до степени + p + th ), чтобы получить новый номер + m + .
Затем посмотрите на цифру + d + в первом десятичном знаке + m + . Если + d + меньше 5, округлите + m + до ближайшего целого числа. В противном случае, округлить + m + вверх.
Наконец, сдвиньте десятичную точку назад местами + p + , разделив + m + на 10ᵖ. _ _
Это простой алгоритм! Например, число + 2.5 + , округленное до ближайшего целого числа, равно + 3 + . Число + 1.64 + , округленное до одного десятичного знака, равно + 1.6 + .
Теперь откройте сеанс интерпретатора и округлите + 2.5 + до ближайшего целого числа, используя встроенный в Python https://docs.python.org/3/library/functions.html#round [ + round () + ] функция:
Как + round () + обрабатывает число + 1.5 + ?
Итак, + round () + округляет + 1.5 + до + 2 + , а + 2.5 + до + 2 + !
Прежде чем вы поднимите проблему с трекером ошибок Python, позвольте мне заверить вас, что + round (2.5) + должен возвращать + 2 + . Есть веская причина, почему + round () + ведет себя так же, как и он.
Из этой статьи вы узнаете, что существует больше способов округлить число, чем вы ожидаете, каждый из которых имеет свои уникальные преимущества и недостатки. + round () + ведет себя в соответствии с определенной стратегией округления, которая может или не может быть той, которая вам нужна в данной ситуации.
Возможно, вы задаетесь вопросом: «Может ли способ, которым я округляю числа, действительно так сильно влияет?» Давайте посмотрим, насколько экстремальными могут быть последствия округления.
Какое влияние может оказать округление?
Предположим, у вас невероятно счастливый день и вы нашли 100 долларов на земле. Вместо того, чтобы тратить все свои деньги сразу, вы решаете проявить смекалку и инвестировать свои деньги, покупая некоторые акции разных акций.
Стоимость акций зависит от спроса и предложения. Чем больше людей хотят купить акции, тем больше их ценность, и наоборот. На фондовых рынках большого объема стоимость конкретной акции может колебаться в секунду.
Давайте проведем небольшой эксперимент. Мы будем притворяться, что общая стоимость приобретенных вами акций колеблется от небольшого случайного числа каждую секунду, например, от 0,05 до 0,05 доллара. Это колебание не обязательно может быть хорошим значением только с двумя десятичными знаками. Например, общая стоимость может увеличиться на 0,031286 долл. США за одну секунду и уменьшиться в следующую секунду на 0,028476 долл. США.
Вы не хотите отслеживать свою ценность до пятого или шестого знака после запятой, поэтому вы решили отрубить все после третьего знака после запятой. На жаргонном языке это называется усечением числа до третьего знака после запятой. Здесь следует ожидать некоторую ошибку, но, сохраняя три знака после запятой, эта ошибка не может быть существенной. Правильно?
Чтобы запустить наш эксперимент с использованием Python, давайте начнем с написания функции + truncate () + , которая усекает число до трех десятичных знаков:
Функция + truncate () + работает, сначала сдвигая десятичную точку в числе + n + на три позиции вправо, умножая + n + на + 1000 + . Целая часть этого нового числа берется с помощью + int () + . Наконец, десятичная точка сдвигается на три позиции назад влево путем деления + n + на + 1000 + .
Далее давайте определим начальные параметры симуляции. Вам понадобятся две переменные: одна для отслеживания фактической стоимости ваших акций после завершения моделирования, а другая — для стоимости ваших акций после того, как вы урезали до трех знаков после запятой на каждом шаге.
Начните с инициализации этих переменных в + 100 + :
Теперь давайте запустим симуляцию в течение 1 000 000 секунд (примерно 11,5 дней). Для каждой секунды генерируйте случайное значение между + -0.05 + и + 0.05 + с помощью функции +iform () + в модуле + random + , а затем обновляйте + actual + и `+ truncated + `:
Основная часть симуляции происходит в цикле + for + , который проходит по диапазону + (1000000) + чисел между + 0 + и + 999,999 + . Значение, взятое из + range () + на каждом шаге, сохраняется в переменной + _ + , которую мы используем здесь, потому что нам фактически не нужно это значение внутри цикла.
На каждом шаге цикла новое случайное число между + -0.05 + и + 0.05 + генерируется с использованием + random.randn () + и присваивается переменной + randn + . Новое значение ваших инвестиций рассчитывается путем добавления + randn + к + actual_value + , а усеченная сумма вычисляется путем добавления + randn + к + truncated_value + и затем обрезания этого значения с помощью + truncate () + ,
Как вы можете видеть, проверив переменную + actual_value + после запуска цикла, вы потеряли всего около $ 3,55. Однако, если бы вы смотрели на + truncated_value +, вы бы подумали, что потеряли почти все свои деньги!
Чтобы узнать больше о случайности в Python, ознакомьтесь с Generating Random Data в Python (Руководство).
Не обращая внимания на момент, когда + round () + не ведет себя так, как вы ожидаете, давайте попробуем повторно запустить симуляцию. Мы будем использовать + round () + на этот раз для округления до трех знаков после запятой на каждом шаге и + seed () + для симуляции снова, чтобы получить те же результаты, что и раньше:
Как ни шокирует, эта точная ошибка вызвала настоящий ажиотаж в начале 1980-х годов, когда система, предназначенная для записи значения Vancouver Stock Exchange, усекла общее значение индекса до трех знаков после запятой вместо округления. Ошибки округления имеют http://mate.uprh.edu/
Важно, как вы округляете числа, и, как ответственный разработчик и разработчик программного обеспечения, вы должны знать, каковы общие проблемы и как их решать. Давайте рассмотрим, каковы различные методы округления и как вы можете реализовать каждый из них на чистом Python.
Зверинец методов
Существует plethora стратегий округления, каждый из которых имеет свои преимущества и недостатки. В этом разделе вы узнаете о некоторых наиболее распространенных методах и о том, как они могут повлиять на ваши данные.
сокращение
Самый простой, хотя и самый грубый метод округления числа — это усечение числа до заданного числа цифр. Когда вы усекаете число, вы заменяете каждую цифру после данной позиции на 0. Вот некоторые примеры:
Как работает функция round в Python?
Функция Python round() очень полезна, когда мы хотим выполнить операцию округления.
Часто требуется быстро оценить значение, округлив или уменьшив длинные десятичные дроби с плавающей запятой. round() особенно полезен в этом случае.

Синтаксис функции Python round()
Функция очень простая. Он берет число и выводит желаемое округленное число.
Здесь нам нужно округлить num , поэтому мы передаем его в round() . Мы также можем указать точность округления с помощью ndigits . Это гарантирует, что число будет округлено с точностью до ndigits после десятичной точки.
Если вы хотите округлить его до целых значений, вам не нужно указывать это значение. В этом случае будет возвращено ближайшее целочисленное значение.
Кроме того, если число имеет форму x.5 , значения будут округлены в большую сторону, если округленное значение является четным числом. В противном случае оно будет округлено в меньшую сторону.
Например, 2,5 будет округлено до 2, поскольку 2 — ближайшее четное число, а 3,5 будет округлено до 4.
После этого давайте рассмотрим несколько примеров:
1 Целочисленное округление
В приведенном ниже фрагменте показано, как можно округлять числа до ближайшего целого.
2 Округление в четную сторону
Как упоминалось ранее, если и четная, и нечетная стороны одинаково близки к числу ( x.5 ), то округление произойдет с четной стороной.
3 Округление с помощью ndigit = None.
Если аргумент ndigit не указан (или None ), будет выполнено округление до ближайшего целого числа.
4 Округление с ndigit <0
Мы также можем передать отрицательное значение аргументу ndigit . Округление начнется слева от десятичной точки!
Итак, если у нашего исходного числа 3 цифры после десятичной точки, передача ndigit = -3 удалит эти 3 цифры перед десятичной точкой и заменит их на 0, что даст нам 0!
Аномалии при округлении чисел с плавающей запятой
Поскольку числа с плавающей запятой определяются их точностью, Python приближает эти числа во время вычислений. Из-за этих приближений их округление может иногда давать неожиданные результаты.
Рассмотрим блок ниже, результаты которого могут быть неожиданными:
Давайте посмотрим еще на несколько примеров:
Опять же, из-за приближения к плавающей запятой мы не получаем точного результата. В первом случае мы ожидали 21.58 , но получили только 21.57 .
Из-за этого всегда будьте осторожны при работе с числами с плавающей запятой, так как эти небольшие изменения вывода могут создать огромные проблемы.
Использование round() для настраиваемых объектов
Метод Python round() внутренне вызывает метод __round__() .
Мы можем переопределить этот метод, если создаем собственный класс. Следовательно, любой вызов round() для нашего объекта вместо этого перейдет к этому переопределяющему методу.
Как видите, мы смогли реализовать нашу собственную функцию округления для объекта MyClass .
Функция round() в Python
Функция round() в Python используется для выполнения операции округления чисел.
Число округляется с точностью до ndigits после десятичной точки. Если ndigit не указан или равно None, возвращается ближайшее целое число.
При округлении входного числа до целого числа, если значения округления в большую и меньшую сторону одинаково близки, возвращается четное число. Например, 10,5 будет округлено до 10, а 11,5 будет округлено до 12.
Для ndigits допустимо любое целочисленное значение (положительное, нулевое или отрицательное).
Примеры функции
Давайте посмотрим на пример функции round().
round() в целое число:
round() в четную сторону:
round() с ndigit, как None:
round() с отрицательной цифрой:
С плавающей запятой
Когда округление применяется к числам с плавающей запятой, результат иногда может быть неожиданным. Это потому, что числа хранятся в двоичном формате, и в большинстве случаев десятичные дроби не могут быть представлены точно, как двоичные дроби.
Python выполняет аппроксимацию и представляет нам округленное значение, поскольку эта арифметика с плавающей запятой иногда может приводить к неожиданным значениям.
Давайте посмотрим на несколько примеров функции round() с числами с плавающей запятой.
Обратите внимание, что округление первого числа с плавающей запятой кажется неправильным. В идеале его следует округлить до 2,68.
Это ограничение арифметических операций с числами с плавающей запятой, мы не должны полагаться на условную логику при работе с числами с плавающей запятой.
round() с настраиваемым объектом
Мы также можем использовать функцию round() с настраиваемым объектом, если они реализуют функцию __round __(). Давайте посмотрим на пример.
Округление чисел в Python

Статьи
Введение
В данной статье разберём различные способы округления чисел в языке программирования Python.
Округление чисел встроенными функциями
Округление чисел функцией round() в Python
Функция round() округляет число до указанного количества знаков после запятой.
Округление чисел функцией int() в Python
Функция int() преобразовывает данные в целочисленный тип округляя их в сторону нуля.
Если нужно, чтобы число преобразовалось по математическим правилам, то требуется выполнить некоторые действия:
- Если число является положительным, то прибавить к нему 0,5;
- если же число является отрицательным, то прибавить к нему -0,5.
Округление чисел функциями из модуля math
Для использования функция из модуля math мы его импортируем:
Округление чисел функцией ceil() в Python
Функция ceil() служит для округления чисел до наименьшего целого числа.
Округление чисел функцией floor()
Функция floor() служит для округления чисел до наибольшего целого числа.
Заключение
В ходе статьи мы с Вами разобрали различные способы округления чисел в языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов!