Баннер мобильный (3) Пройти тест

Округление чисел в Python: выбираем лучший способ

Учимся округлять числа

Разбор

23 января 2025

Поделиться

Скопировано
Округление чисел в Python: выбираем лучший способ

Содержание

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

    Что такое округление и зачем оно нужно

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

    14.9 ≈ 15

    0.128 ≈ 0.13

    49987 ≈ 50000

    Округление может понадобиться, когда в расчётах не требуется высокая точность или когда приближённого значения вполне достаточно для приемлемой точности результата вычислений. Также округление может значительно упростить вычисления.

    Ведь куда удобнее представить то же число π в виде скромного 3.14, а не как, допустим, 3.14159265358979323846, если этого не требует точность расчётов. Округлённые числа намного легче читаются и воспринимаются. Когда мы видим числа с большим количеством знаков после запятой, это выглядит громоздко, запутанно и непонятно. Особенно если таких чисел много.

    И, конечно, следует отметить, что округление полезно ещё с точки зрения экономии времени. Очевидно, что с округлёнными числами работать быстрее, так как они содержат меньшее количество знаков.

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

    Функция round()

    Это встроенная функция в языке Python. То есть для ее использования не нужно производить импорт каких-либо модулей. В общем виде запись этой функции выглядит так:

    round(number, digits)

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

    Так, во второй версии Python округление производится согласно правилам классической арифметики.

    То есть, если после запятой присутствуют цифры от 1 до 4, то округление происходит в меньшую сторону, а если после запятой находятся цифры от 5 до 9 — в большую. В третьей же версии округление происходит по так называемому «банковскому» методу. Это означает, что округление производится до ближайшего чётного числа.

    Для примера возьмём число 4.5 и округлим его по банковскому методу. Ближайшие чётные числа к нему — это 4 и 6. Значит, результат округления будет равен 4, так как число 4 ближе к исходному числу, чем 6. А вот число 5.5 будет округлено до 6, так как на этот раз число 6 ближе к исходному числу, чем 4.

    Вот пример небольшого исходника, который иллюстрирует применение функции round() в Python:

    num = round(3.5)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    4

    Выше показан пример без второго аргумента. Возьмем другое число и добавим второй аргумент:

    num = round(6.45892, 2)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    6.46

    Как видим, использовать функцию round() совсем не сложно. Рассмотрим следующую функцию.

    Функция int()

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

    Вот простой пример:

    num = int(6.452)
    
    print(num)

    В результате получим:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    6

    Тот же самый результат мы получим, если возьмем число 6.9:

    num = int(6.9)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    6

    Такой способ идеально подойдет, если вам нужна только целая часть числа. Далее рассмотрим функции из модуля math.

    Функции для округления из модуля math

    Перед использованием функций из модуля math, этот модуль сначала нужно импортировать. Для этого в самом начале исходника пишем:

    import math

    И теперь можно смело использовать любые функции из этого модуля. Далее мы рассмотрим три функции, которые используются для округления чисел.

    Функция math.ceil()

    Эта функция производит округление в большую сторону. Приведем пример:

    num = math.ceil(6.8)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    7

    Функция math.floor()

    А это функция округляет в меньшую сторону. Пример:

    num = math.floor(6.8)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    6

    Функция math.trunc()

    Это аналог уже рассмотренной функции int(). Делает она то же самое: отбрасывает дробную часть, оставляя только целое число. Пример:

    num = math.trunc(17.231449)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    17

    Теперь поговорим об использовании еще одного модуля для округления чисел.

    Метод quantize() из модуля decimal

    Перед использованием этот модуль сначала нужно импортировать:

    import decimal

    Для округления используется метод quantize(), которому в качестве аргумента передается объект Decimal указывающий формат округления, то есть до скольки знаков после запятой следует производить округление. Метод нужно применять также к объекту Decimal, который указывает какое число следует округлить. Пример кода:

    num = decimal.Decimal('16.357148').quantize(decimal.Decimal('1.00'))
    
    print(num)

    Результат выполнения:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    16.36

    В данном случае округление произошло до двух знаков после запятой, о чем нам говорит аргумент decimal.Decimal(‘1.00’) в методе quantize(). Также этому методу в качестве второго аргумента можно передавать специальные константы активирующие различные режимы округления. По умолчанию используется константа ROUND_HALF_EVEN, в согласии с которой округление производится до ближайшего четного числа. Далее рассмотрим остальные константы.

    ROUND_CEILING

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

    num = decimal.Decimal('0.6600001').quantize(decimal.Decimal('1.00'), decimal.ROUND_CEILING)
    
    print(num)

    Результат выполнения:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    0.67

    ROUND_FLOOR

    Округление в меньшую сторону (в сторону отрицательной бесконечности). Пример кода:

    num = decimal.Decimal('0.6600001').quantize(decimal.Decimal('1.00'), decimal.ROUND_FLOOR)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    0.66

    ROUND_DOWN

    Округление в направлении нуля, то есть округление ведется всегда в меньшую сторону и не зависит от того какое число стоит справа от разряда. Приведем пример:

    num = decimal.Decimal('12.238447').quantize(decimal.Decimal('1.00'), decimal.ROUND_DOWN)
    
    print(num)

    Результат выполнения:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    12.23

    ROUND_UP

    Округление от нуля, если справа от разряда находится цифра отличная от нуля. Пример:

    num = decimal.Decimal('12.238447').quantize(decimal.Decimal('1.00'), decimal.ROUND_UP)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    12.24

    ROUND_HALF_DOWN

    Округляет число от нуля в большую сторону, если справа от разряда идет цифра 6 или выше. В противном случае округление происходит в сторону нуля. Пример:

    num = decimal.Decimal('18.239').quantize(decimal.Decimal('1.00'), decimal.ROUND_HALF_DOWN)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    18.24

    ROUND_HALF_UP

    Работает как предыдущий режим, исключая то, что округление происходит в сторону повышения, если справа от разряда идет число 5 или выше. Пример:

    num = decimal.Decimal('18.239').quantize(decimal.Decimal('1.00'), decimal.ROUND_HALF_UP)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    18.24

    ROUND_05UP

    Округляет от нуля, только если последняя цифра округляемого разряда 0 или 5. В противном случае округление идет в сторону нуля. Пример:

    num = decimal.Decimal('25.148').quantize(decimal.Decimal('1.00'), decimal.ROUND_05UP)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    25.14

    Далее предлагаем выполнить небольшое задание.

    Задание для самостоятельного выполнения

    Напишите программу на языке Python, которая округляет числа при помощи модуля decimal и позволяет пользователю ввести с клавиатуры округляемое число и формат округления. Режим округления пусть будет по умолчанию.

    Решение

    Используем функцию input() для получения данных вводимых пользователем. Создаем две переменные с именами number и round_format и присваиваем им эти данные. Далее эти переменные передаем в соответствующие объекты Decimal. Результат вычислений записываем в переменную result и выводим при помощи функции print(). В итоге код будет примерно таким:

    import decimal
    
    number = input("Введите число: ")
    
    round_format = input("Введите формат округления: ")
    
    result = decimal.Decimal(number).quantize(decimal.Decimal(round_format))
    
    print(result)

    Пример работы программы:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    Введите число: 22.48999
    Введите формат округления: 1.000
    22.490

    Подведем итоги 

    • Округление чисел заменяет одно число другим приближенно равным первому. Оно может понадобиться когда не нужна высокая точность или когда приближенного значения достаточно для тех или иных расчетов.
    • Округление может быть полезно для упрощения и ускорения вычислений, а также для облегчения восприятия большого количества чисел. 
    • В языке Python имеются несколько функций для операций округления. Такие функции как round и int не требуют импорта каких-либо модулей. 
    • Также в Python есть модули math и decimal. Некоторые функции и методы из этих модулей позволяют достаточно легко производить округление чисел. 

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии