Да ли се бавите нумеричким подацима у Пајтону? Подигните своје вештине учењем различитих приступа за заокруживање бројева.
Већина реалних скупова података садржи нумеричке и категоричке карактеристике. Нумеричке карактеристике се крећу од очитавања сензора до курсева валута, биомедицинских сигнала и још много тога.
Приликом рада са нумеричким вредностима, можда ће бити неопходно заокружити их на одређену прецизност из разлога као што су:
- Обезбеђивање униформног формата
- Једноставније складиштење и обрада
У овом водичу, истражићемо различите методе за заокруживање броја на задату прецизност, заокруживање бројева навише и наниже до најближег целог броја и још много тога.
Започнимо.
Како заокружити бројеве користећи уграђену `round()` функцију
Најчешћи начин за заокруживање бројева у Пајтону је коришћење уграђене `round()` функције. Почнимо са њеном синтаксом:
round(num, ndigits)
где је:
- `num` број који желимо заокружити
- `ndigits` је опциони параметар са подразумеваном вредношћу `None`. Он представља број цифара на које треба заокружити број. Ако је `ndigits` = 2, број се заокружује на две децимале.
- Функција `round()` враћа број заокружен на `ndigits` места после децималног зареза.
Примери употребе Пајтон `round()` функције
Погледајмо неке примере кодирања да бисмо разумели како ради функција `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()` углавном следи опште принципе заокруживања из школске математике. Али, то није увек случај.
Постоје нека ограничења са бројевима са покретним зарезом. Због тога можете видети неочекиване резултате приликом заокруживања. Још један интересантан аспект је банкарско заокруживање.
Шта је банкарско заокруживање?
Покрените Пајтон РЕПЛ и испробајте следећи пример:
>>> round(1.5) 2
Видимо да `round(1.5)` враћа 2 (као што се очекује). Дакле, шта би требало да врати `round(2.5)`?
>>> round(2.5) 2
Занимљиво, зар не? И `round(1.5)` и `round(2.5)` враћају 2. Али како и зашто?
Интерно, функција заокруживања ради на следећи начин: свака вредност која се налази тачно на пола пута између два цела броја се заокружује на најближи паран цео број. Ово је познато као банкарско заокруживање или „заокруживање половине на парно“ стратегија.
Знамо да је функција `round()` довољна за једноставне задатке заокруживања. Али понекад ће можда бити потребно заокружити број навише или наниже до најближег целог броја.
Како се то постиже? Сазнајмо у следећем делу.
Како заокружити бројеве навише у Пајтону
Да бисте заокружили број навише до најближег целог броја, можете користити:
Коришћење `math.ceil()`
Функција `ceil()` (или функција плафона) ради тако што заокружује број на најмањи цео број који је већи од тог броја.
Следећи исечак кода приказује како се функција `ceil()` користи за заокруживање броја 3.2 навише:
import math number = 3.2 rounded_up = math.ceil(number) print(rounded_up) # Output: 4
Коришћење `decimal` модула
До сада смо користили уграђени тип података `float`. Али, за одређене примене у научном рачунарству и финансијама потребна нам је знатно већа прецизност. За ту сврху, Пајтон долази са `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.
Како заокружити бројеве наниже у Пајтону
Хајде да сада погледамо како да заокружимо бројеве наниже у Пајтону. Слично процесу заокруживања навише, можемо користити или математички или децимални модул.
Коришћење `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()` заокружује половину на парно, што можда није увек пожељно. Постоје неке друге уобичајене замке које треба избегавати приликом заокруживања бројева у Пајтону:
- Нетачно поређење једнакости: заокруживање бројева често доводи до грешке заокруживања. Ако покушате да извршите поређење једнакости између заокруженог резултата са другом вредношћу, провера једнакости ће (скоро увек) бити неуспешна због различите прецизности. Зато покушајте да избегнете проверу једнакости између бројева са покретним зарезом и заокружених бројева. Ако је поређење неопходно, онда уведите праг толеранције.
- Губитак информација: Можда ћете желети да одређени подаци, попут очитавања сензора у различитим временским ознакама, буду снимљени са високом прецизношћу. Заокруживање таквих података на мање децималних места доводи до губитка информација и нетачне анализе.
- Заокруживање међурезултата: Често ћете имати више корака као део прорачуна. Користите доследну прецизност у свим корацима. Избегавајте заокруживање у међукорацима да бисте спречили да се грешке заокруживања нагомилају.
Најбоље праксе за заокруживање бројева у Пајтону
Наведимо неке најбоље праксе које треба следити приликом заокруживања бројева у Пајтону:
- Одаберите одговарајући тип података: бирајте између типова података са покретним зарезом и децималним зарезом у зависности од примене. Ако је потребна прецизна аритметика са покретним зарезом, одаберите децимални тип података.
- Користите доследне нивое прецизности: поставите доследне нивое прецизности за децималне бројеве током целог програма да бисте избегли неочекиване грешке заокруживања.
- Документујте технике заокруживања: у реалним апликацијама које укључују податке као што су валута и очитавања сензора, важно је да постоји доследна и документована техника заокруживања.
Закључак
Завршимо овај водич кратким прегледом онога што смо научили:
- Можете користити уграђену функцију `round()` са синтаксом `round(num, ndigits)`. При коришћењу `round()`, требало би да будете свесни банкарске стратегије заокруживања. То значи да заокружује бројеве који се налазе тачно на пола пута између два цела броја на најближи паран цео број.
- Можете користити функције `ceil()` и `floor()` из математичког модула за заокруживање датог броја навише и наниже до најближег целог броја, респективно.
- Када треба да извршите аритметику високе прецизности са покретним зарезом, користите `decimal` модул. Можете заокружити бројеве са потребном прецизношћу и стратегијом заокруживања.
- Требало би да будете свесни уобичајених грешака при заокруживању бројева у Пајтону. То укључује губитак информација услед заокруживања, заокруживање резултата у међукорацима и коришћење различите прецизности у различитим деловима кода.
- Најбоље праксе подразумевају избор правог типа података у зависности од примене и документовање доследних нивоа прецизности.
Следеће, научите како да извршите дељење у Пајтону.
Да ли вам је овај чланак био користан?
Хвала на повратним информацијама!