Czy pracujesz z danymi numerycznymi w Pythonie? Wzbogać swoje umiejętności, eksplorując rozmaite metody zaokrąglania liczb w tym języku programowania.
Większość zbiorów danych, które spotykamy w rzeczywistości, zawiera zarówno informacje liczbowe, jak i kategorie. W świecie cyfr mamy do czynienia z wieloma różnymi wartościami – od odczytów z czujników, poprzez kursy walut, aż po dane biomedyczne i wiele innych.
Podczas obróbki danych numerycznych często zachodzi potrzeba zaokrąglenia ich do konkretnej precyzji. Powody tego mogą być różnorakie:
- Utrzymanie jednolitego formatu danych.
- Ułatwienie procesu przechowywania i analizy.
W tym poradniku zgłębimy różne metody zaokrąglania liczb do określonej dokładności, nauczymy się zaokrąglać liczby w górę i w dół do najbliższej liczby całkowitej i poznamy wiele innych technik.
Zacznijmy naszą podróż.
Jak zaokrąglać liczby za pomocą wbudowanej funkcji `round()`
Najczęściej wykorzystywaną metodą zaokrąglania liczb w Pythonie jest użycie wbudowanej funkcji `round()`. Zgłębmy jej składnię:
round(num, ndigits)
W tym przypadku:
- `num` to liczba, którą chcesz zaokrąglić.
- `ndigits` to parametr opcjonalny, który domyślnie nie jest ustawiony. Określa on liczbę miejsc po przecinku, do której liczba ma być zaokrąglona. Na przykład, jeśli `ndigits = 2`, liczba zostanie zaokrąglona do dwóch miejsc po przecinku.
- Funkcja `round()` zwraca liczbę zaokrągloną do `ndigits` miejsc po przecinku.
Przykłady zastosowania funkcji `round()` w Pythonie
Przeanalizujmy kilka przykładów, aby lepiej zrozumieć, jak działa funkcja `round()`.
Jak wspomniano, `ndigits` jest opcjonalne. Jeżeli wywołamy funkcję `round()` podając tylko liczbę, zostanie ona zaokrąglona do najbliższej liczby całkowitej.
number = 7.123456 rounded = round(number) print(rounded) # Wynik: 7
Teraz przejdźmy do przykładów, gdzie określamy precyzję zaokrąglenia.
Jeżeli `ndigits` wynosi 2, liczba zostaje zaokrąglona do dwóch miejsc po przecinku (czyli do części setnych):
number = 7.123456 rounded = round(number, 2) print(rounded) # Wynik: 7.12
Jeżeli `ndigits` wynosi 3, liczba zostaje zaokrąglona do trzech miejsc po przecinku (czyli do części tysięcznych):
number = 7.123456 rounded = round(number, 3) print(rounded) # Wynik: 7.123
Funkcja `round()` może być używana również do zaokrąglania liczb ujemnych:
number = -3.4 rounded = round(number) print(rounded) # Wynik: -3
W tym przykładzie -3.4 zostaje zaokrąglone do -3, czyli najbliższej liczby całkowitej.
Zaokrąglanie do najbliższej dziesiątki i setki
Czy wiedziałeś, że `ndigits` może przyjmować również wartości ujemne?
Tak, możesz wywołać funkcję `round()` z ujemnymi wartościami parametru `ndigits`. W takim przypadku zaokrąglenie nastąpi na lewo od przecinka dziesiętnego, a nie na prawo.
Co to dokładnie oznacza? Prześledźmy kilka przykładów.
Kiedy `ndigits` ustawimy na -1, liczba zostanie zaokrąglona do najbliższej dziesiątki.
number = 7.123456 rounded = round(number, -1) print(rounded) # Wynik: 10.0
Wywołanie funkcji `round()` z `ndigits` ustawionym na -2 zaokrągla liczbę 77.123456 do najbliższej setki, czyli w tym przypadku do 100.0.
number = 77.123456 rounded = round(number, -2) print(rounded) # Wynik: 100.0
Do tej pory funkcja `round()` wydaje się działać zgodnie z zasadami zaokrąglania, które poznaliśmy na lekcjach matematyki. Nie zawsze jednak tak jest.
Istnieją pewne ograniczenia związane z liczbami zmiennoprzecinkowymi. Z tego powodu, podczas zaokrąglania, możemy uzyskać zaskakujące rezultaty. Dodatkowym aspektem jest tak zwane zaokrąglanie bankiera.
Co to jest zaokrąglanie bankiera?
Uruchom konsolę Pythona i przetestuj następujący przykład:
>>> round(1.5) 2
Widzimy, że `round(1.5)` zwraca 2 (co jest zgodne z oczekiwaniami). Zatem, co powinna zwrócić `round(2.5)`?
>>> round(2.5) 2
Interesujące, prawda? Zarówno `round(1.5)`, jak i `round(2.5)` zwracają 2. Jak to się dzieje i dlaczego?
Wewnętrznie funkcja `round()` działa w następujący sposób: każda wartość znajdująca się dokładnie w połowie między dwiema liczbami całkowitymi, jest zaokrąglana do najbliższej parzystej liczby całkowitej. Jest to tak zwane zaokrąglanie bankiera, które ma na celu zrównoważenie procesu zaokrąglania.
Wiemy już, że do prostych zadań zaokrąglania wystarczy nam funkcja `round()`. Czasami jednak może wystąpić konieczność zaokrąglenia liczby w górę lub w dół do najbliższej liczby całkowitej.
Jak to zrobić? Dowiesz się tego w kolejnej sekcji.
Jak zaokrąglać liczby w górę w Pythonie
Aby zaokrąglić liczbę do najbliższej liczby całkowitej w górę, możemy skorzystać z:
Użycie `math.ceil()`
Funkcja `ceil()` (zwana również funkcją sufitową) zaokrągla liczbę w górę do najmniejszej liczby całkowitej, która jest większa od danej liczby.
Poniższy fragment kodu pokazuje, jak użyć funkcji `ceil()` do zaokrąglenia liczby 3.2 w górę:
import math number = 3.2 rounded_up = math.ceil(number) print(rounded_up) # Wynik: 4
Wykorzystanie modułu `decimal`
Do tej pory operowaliśmy na wbudowanym typie danych `float`. Jednak w pewnych zastosowaniach, szczególnie w informatyce naukowej i finansach, potrzebujemy znacznie większej precyzji. W tym celu Python dostarcza moduł `decimal`, który oferuje:
- Bardziej precyzyjną arytmetykę zmiennoprzecinkową.
- Niezawodne testy równości.
- Lepszą kontrolę nad poziomem precyzji (domyślnie 28 miejsc po przecinku).
Aby sprawdzić bieżący kontekst, użyj funkcji `getcontext()`, jak pokazano poniżej:
from decimal import getcontext current_context = getcontext() print(current_context)
Powinieneś zobaczyć między innymi aktualny tryb precyzji i zaokrąglania:
# Wynik Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
Aby zaokrąglić liczbę, możemy użyć metody `quantize()`, precyzując:
- Precyzję (0.0, ponieważ chcemy zaokrąglić do najbliższej liczby całkowitej) i
- Tryb zaokrąglania: `ROUND_CEILING`.
from decimal import Decimal, ROUND_CEILING number = Decimal('3.2') rounded_up = number.quantize(Decimal('0'), rounding=ROUND_CEILING) print(rounded_up) # Wynik: 4
W tym przykładzie, liczba 3.2 została zaokrąglona w górę do najbliższej liczby całkowitej, czyli 4.
Jak zaokrąglać liczby w dół w Pythonie
Przyjrzyjmy się teraz, jak zaokrąglić liczby w dół w Pythonie. Podobnie jak w przypadku zaokrąglania w górę, możemy posłużyć się modułami `math` lub `decimal`.
Wykorzystanie `math.floor()`
Funkcja `floor()` z modułu `math` działa w następujący sposób: zaokrągla liczbę w dół do największej liczby całkowitej, która jest mniejsza od danej liczby.
Rozważmy następujący przykład:
import math number = 3.8 rounded_down = math.floor(number) print(rounded_down) # Wynik: 3
W tym przypadku funkcja `floor()` zaokrągla liczbę zmiennoprzecinkową w dół z 3.8 do 3.
Korzystanie z modułu `decimal`
Aby zaokrąglić liczbę w dół, możemy użyć metody `quantize()`, ustawiając tryb zaokrąglania na `ROUND_FLOOR`.
from decimal import Decimal, ROUND_FLOOR number = Decimal('3.8') rounded_down = number.quantize(Decimal('0'), rounding=ROUND_FLOOR) print(rounded_down) # Wynik: 3
Jak widzimy, 3.8 zostało zaokrąglone w dół do 3.
Typowe pułapki, których należy unikać przy zaokrąglaniu liczb
Widzieliśmy już, że funkcja `round()` zaokrągla połowę do najbliższej parzystej liczby, co nie zawsze jest pożądane. Istnieje kilka innych typowych pułapek, których należy unikać przy zaokrąglaniu liczb w Pythonie:
- Nieprawidłowe porównywanie równości: Zaokrąglanie liczb często wprowadza błędy związane z zaokrąglaniem. Próba porównania zaokrąglonego wyniku z inną wartością za pomocą operatora równości zazwyczaj zakończy się niepowodzeniem ze względu na różnice w precyzji. Staraj się więc unikać sprawdzania równości między liczbami zmiennoprzecinkowymi a zaokrąglonymi liczbami zmiennoprzecinkowymi. Jeżeli porównanie jest konieczne, wprowadź pewien próg tolerancji.
- Utrata informacji: Bywa, że chcemy, aby niektóre dane, takie jak odczyty czujników w różnych momentach czasu, były rejestrowane z wysoką precyzją. Zaokrąglanie takich danych do mniejszej liczby miejsc po przecinku prowadzi do utraty ważnych informacji i może zaburzyć analizę.
- Zaokrąglanie wyników pośrednich: Często w ramach obliczeń wykonujemy wiele kroków. Staraj się utrzymywać stałą precyzję na wszystkich etapach obliczeń. Unikaj zaokrąglania na etapach pośrednich, aby zapobiec kumulacji błędów zaokrągleń.
Najlepsze praktyki zaokrąglania liczb w Pythonie
Wymieńmy kilka najlepszych praktyk, których warto przestrzegać podczas zaokrąglania liczb w Pythonie:
- Wybierz odpowiedni typ danych: Dobierz typ danych zmiennoprzecinkowy lub dziesiętny w zależności od potrzeb aplikacji. Jeżeli potrzebujesz precyzyjnej arytmetyki zmiennoprzecinkowej, wybierz typ danych `decimal`.
- Stosuj stałą precyzję: Ustaw spójne poziomy precyzji liczb dziesiętnych w całym programie, aby uniknąć nieoczekiwanych błędów zaokrągleń.
- Dokumentuj techniki zaokrąglania: W aplikacjach, które przetwarzają dane, takie jak dane finansowe lub odczyty czujników, ważne jest stosowanie spójnej i udokumentowanej metody zaokrąglania.
Podsumowanie
Podsumujmy nasz poradnik krótkim przeglądem tego, czego się nauczyliśmy:
- Możesz korzystać z wbudowanej funkcji `round()` o składni `round(num, ndigits)`. Używając tej funkcji, należy pamiętać o stosowanej strategii zaokrąglania bankiera, która zaokrągla liczby dokładnie w połowie odległości między dwiema liczbami całkowitymi do najbliższej parzystej liczby całkowitej.
- Możesz użyć funkcji `ceil()` i `floor()` z modułu `math`, aby odpowiednio zaokrąglić daną liczbę w górę lub w dół do najbliższej liczby całkowitej.
- Jeżeli potrzebujesz wykonywać bardzo precyzyjną arytmetykę zmiennoprzecinkową, użyj modułu `decimal`. Pozwala on na zaokrąglanie liczb z wymaganą precyzją i wybraną strategią zaokrąglania.
- Powinieneś być świadomy typowych pułapek, które pojawiają się przy zaokrąglaniu liczb w Pythonie. Należą do nich utrata informacji w wyniku zaokrągleń, zaokrąglanie wyników pośrednich oraz stosowanie różnej precyzji w różnych częściach kodu.
- Dobre praktyki obejmują wybór odpowiedniego typu danych w zależności od potrzeb aplikacji i dokumentowanie stałych poziomów precyzji.
Teraz dowiedz się, jak wykonywać dzielenie podłogowe w Pythonie.
Czy ten artykuł był pomocny?
Dziękujemy za Twoją opinię!