Як округлити числа в Python [With Examples]

Заглиблюєтесь у роботу з числовими типами даних у Python? Підніміть свої навички на новий рівень, досліджуючи різноманітні способи округлення чисел у цій мові програмування.

Більшість реальних наборів даних містить комбінацію числових і категоріальних ознак. Існує безліч варіантів числових даних, починаючи від показань сенсорів і закінчуючи валютними курсами, біомедичними сигналами та іншим.

Під час обробки числових значень, вам може знадобитися округлити їх до певної точності, і ось декілька причин чому:

  • Для забезпечення єдиного формату представлення даних.
  • Для спрощення процесу зберігання та подальшої обробки.

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

Тож, почнемо!

Як використовувати вбудовану функцію round() для округлення чисел

Найбільш поширений метод округлення чисел у Python – це застосування вбудованої функції round(). Розглянемо її синтаксис:

round(num, ndigits)

Де:

  • num – це число, яке необхідно округлити.
  • ndigits – необов’язковий параметр, значення за замовчуванням якого None. Він визначає кількість знаків після коми, до якої потрібно округлити число. Наприклад, ndigits = 2 означає округлення до двох знаків після коми.
  • Функція round() повертає число, округлене до заданої кількості знаків після коми.

Приклади застосування функції round() у Python

Розглянемо декілька прикладів, щоб краще зрозуміти механізм роботи функції round().

Як зазначалося, параметр ndigits є необов’язковим. Тому, якщо викликати round() тільки з одним числом, воно буде округлено до найближчого цілого.

number = 7.123456
rounded = round(number)
print(rounded)
# Output: 7

А тепер, давайте розглянемо приклади, де ми явно вказуємо точність.

Якщо встановити ndigits на 2, то число округлиться до двох знаків після коми (до сотих):

number = 7.123456
rounded = round(number, 2)
print(rounded)
# Output: 7.12

А якщо встановити ndigits на 3, то число округлиться до трьох знаків після коми (до тисячних):

number = 7.123456
rounded = round(number, 3)
print(rounded)
# Output: 7.123

Функцію round() також можна використовувати для округлення від’ємних чисел:

number = -3.4
rounded = round(number)
print(rounded)
# Output: -3

У цьому випадку число -3.4 округлюється до -3, найближчого цілого.

Округлення до десятків і сотень

Чи відомо вам, що параметр ndigits може приймати від’ємні значення?

Так, ви можете використовувати round() з від’ємними значеннями для ndigits. У цьому випадку, округлення відбувається зліва від коми, а не справа.

Що це означає на практиці? Розглянемо декілька прикладів.

Коли ми встановлюємо ndigits на -1, число округлюється до найближчого десятка.

number = 7.123456
rounded = round(number, -1)
print(rounded)
# Output: 10.0

А виклик round() з ndigits рівним -2, округлює число 77.123456 до найближчої сотні, що у цьому випадку дорівнює 100.0.

number = 77.123456
rounded = round(number, -2)
print(rounded)
# Output: 100.0

Здається, що round() дотримується загальних правил округлення, яких нас навчали в школі. Але це не завжди так.

Існують певні особливості чисел з плаваючою комою. Через це, результати округлення можуть бути іноді неочікуваними. Ще один цікавий момент – це так зване “банківське округлення”.

Що таке банківське округлення?

Запустіть Python REPL і спробуйте такий приклад:

>>> round(1.5)
2

Бачимо, що round(1.5) повертає 2 (що цілком очікувано). А що тоді має повернути round(2.5)?

>>> round(2.5)
2

Цікаво, правда? І round(1.5), і round(2.5) повертають 2. Як і чому?

Внутрішній механізм округлення працює таким чином: будь-яке значення, яке знаходиться рівно посередині між двома цілими числами, округлюється до найближчого парного цілого. Це називається банківським округленням або стратегією “округлення до парного”.

Ми знаємо, що функції round() достатньо для простих задач округлення. Але іноді вам може знадобитися округлити число в більшу або меншу сторону до найближчого цілого.

Як це зробити? Розглянемо наступний розділ.

Як округлити числа в більшу сторону в Python

Щоб округлити число до найближчого більшого цілого числа, можна скористатися:

Використання math.ceil

Функція ceil() (або функція “стелі”) працює таким чином: вона округлює число до найменшого цілого, що більше за дане число.

Наступний код демонструє, як використовувати функцію ceil() для округлення числа 3.2:

import math

number = 3.2
rounded_up = math.ceil(number)
print(rounded_up)
# Output: 4

Використання модуля decimal

До цього моменту ми використовували вбудований тип даних float. Але в деяких наукових обчисленнях і фінансових задачах потрібна набагато більша точність. Для цього Python має модуль decimal, який надає:

  • Більш точну арифметику з плаваючою комою.
  • Надійне тестування на рівність.
  • Більш точний контроль за рівнем точності (за замовчуванням точність становить 28 знаків).

Щоб дізнатися про поточний контекст, використовуйте функцію getcontext(), як показано нижче:

from decimal import getcontext
current_context = getcontext()
print(current_context)

Ви побачите поточний режим точності та округлення, серед іншого:

# Output
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

Щоб округлити число, можна застосувати функцію quantize(), вказавши:

  • Точність (0.0, оскільки ми хочемо округлити до найближчого цілого), і
  • Режим округлення: ROUND_CEILING.
from decimal import Decimal, ROUND_CEILING

number = Decimal('3.2')
rounded_up = number.quantize(Decimal('0'), rounding=ROUND_CEILING)
print(rounded_up)
# Output: 4

У цьому випадку число 3.2 округлюється до найближчого більшого цілого числа 4.

Як округлити числа в меншу сторону в Python

Тепер подивимося, як округлювати числа в меншу сторону в Python. Так само, як і при округленні в більшу сторону, ми можемо використовувати або математичний, або десятковий модулі.

Використання math.floor

Функція floor() з математичного модуля працює таким чином: вона округлює число до найбільшого цілого, яке менше за дане число.

Розглянемо приклад:

import math

number = 3.8
rounded_down = math.floor(number)
print(rounded_down)
# Output: 3

У цьому випадку функція floor() округлює число 3.8 до 3.

Використання модуля decimal

Для округлення числа в меншу сторону, можна скористатися функцією quantize(), встановивши режим округлення на ROUND_FLOOR.

from decimal import Decimal, ROUND_FLOOR

number = Decimal('3.8')
rounded_down = number.quantize(Decimal('0'), rounding=ROUND_FLOOR)
print(rounded_down)
# Output: 3

Як бачимо, число 3.8 було округлено до 3.

Поширені помилки, яких слід уникати при округленні чисел

Ми вже з’ясували, що функція round() використовує “округлення до парного”, що не завжди може бути бажаним результатом. Існують й інші поширені помилки, яких слід уникати при округленні чисел у Python:

  • Некоректне порівняння на рівність: округлення чисел часто призводить до помилок округлення. Якщо ви намагаєтесь порівняти результат округлення з іншим значенням на точну рівність, ця перевірка (майже завжди) зазнає невдачі через різницю в точності. Тому намагайтеся уникати перевірки точної рівності між числами з плаваючою комою і округленими числами. Якщо порівняння необхідне, вводьте певний поріг толерантності.
  • Втрата інформації: може виникнути потреба зберегти певні дані, наприклад, показання датчиків з різними часовими мітками, з високою точністю. Округлення таких даних до меншої кількості знаків після коми призводить до втрати інформації та некоректного аналізу.
  • Округлення проміжних результатів: зазвичай обчислення складається з декількох етапів. Намагайтеся підтримувати стабільну точність на всіх етапах. Крім того, уникайте округлення на проміжних етапах, щоб не накопичувати помилки округлення.

Найкращі практики округлення чисел у Python

Перерахуємо декілька найкращих практик, яких слід дотримуватися при округленні чисел у Python:

  • Обирайте правильний тип даних: вибирайте між типами даних з плаваючою комою та типом даних decimal залежно від задачі. Якщо вам необхідна високоточна арифметика з плаваючою комою, оберіть тип даних decimal.
  • Використовуйте узгоджені рівні точності: встановлюйте однакові рівні точності для чисел з плаваючою комою в межах усієї програми, щоб уникнути несподіваних помилок округлення.
  • Документуйте методи округлення: в реальних програмах, які обробляють такі дані, як валюти або показання сенсорів, дуже важливо мати послідовну та задокументовану техніку округлення.

Підсумок

На завершення наведемо короткий огляд того, що ми вивчили:

  • Для округлення чисел ви можете використовувати вбудовану функцію round() з синтаксисом round(num, ndigits). При застосуванні round(), варто пам’ятати про “банківське округлення”. Воно округлює числа, що знаходяться точно між двома цілими, до найближчого парного цілого.
  • Для округлення до найближчого більшого або меншого цілого можна використовувати функції ceil() і floor() з математичного модуля відповідно.
  • Для високоточної арифметики з плаваючою комою застосовуйте модуль decimal. Він дозволяє округлювати числа з необхідною точністю та стратегією округлення.
  • Слід пам’ятати про типові помилки при округленні чисел у Python, такі як втрата інформації, округлення проміжних результатів, та застосування різної точності в різних частинах коду.
  • Найкращі практики включають вибір правильного типу даних в залежності від задачі, а також документування узгоджених рівнів точності.

Далі ви можете дізнатися про операцію цілочисельного ділення в Python.

Чи була ця стаття корисною?

Дякуємо за ваш відгук!