• Programowanie
  • round() w Pythonie - jak zaokrąglać bez pułapek?

round() w Pythonie - jak zaokrąglać bez pułapek?

Radosław Stępień • 25 października 2026
Dwóch maklerów przy stacji NYSE, na ekranie logo Pythona.

Spis treści

Wynik obliczeń ma za dużo miejsc po przecinku, a w raporcie potrzebujesz dwóch: zwykle wystarczy round(wynik, 2), ale rezultat może zaskoczyć, jeśli liczba jest typu float. Szczególnie mylące bywa round(2.675, 2), które zwraca 2.67, choć spodziewany wynik to często 2.68.

Kod Pythona z funkcją `round()`. Pokazuje, jak zaokrąglać liczby, w tym ujemne.

Najkrócej o zaokrąglaniu liczb w Pythonie

  • Składnia: round(liczba, ndigits) zaokrągla do wskazanej liczby miejsc po przecinku.
  • Remisy: wbudowane round() wybiera bliższą parzystą wartość, gdy liczba leży dokładnie pośrodku.
  • Precyzja: float przechowuje liczby dziesiętne jako przybliżenia binarne, co może wpływać na wynik.
  • Pieniądze: do kontrolowanego zaokrąglania wartości dziesiętnych użyj Decimal i jawnie ustaw tryb.
  • Wyświetlanie: f-string z formatem .2f pokazuje dwa miejsca po przecinku, ale zwraca tekst.

round() przyjmuje liczbę i opcjonalną precyzję

Masz wynik 3.14159 i chcesz skrócić go do dwóch miejsc? Użyj drugiego argumentu funkcji: round(3.14159, 2) zwróci 3.14. Gdy pominiesz precyzję, Python zaokrągli do najbliższej liczby całkowitej.

round(3.14159)     # 3
round(3.14159, 2)  # 3.14
round(1234, -2)    # 1200

Argument ndigits może być dodatni, równy zeru lub ujemny. Ujemna wartość zaokrągla do dziesiątek, setek i kolejnych potęg dziesięciu, więc przydaje się choćby do skracania dużych wyników w podsumowaniach. Dokumentacja funkcji wbudowanych Pythona opisuje też, że bez podanego ndigits wynikiem jest liczba całkowita, a z nim zwracany jest typ zgodny z typem argumentu.

Przy remisie Python wybiera parzysty wynik

Zaokrąglanie nie zawsze oznacza „piątka w górę”. Wbudowane round() stosuje regułę ties to even: jeśli wartość znajduje się dokładnie w połowie między dwiema możliwościami, wybiera parzystą.

round(2.5)  # 2
round(3.5)  # 4
round(1.25, 1)  # 1.2
round(1.35, 1)  # 1.4

Przy wielu obliczeniach taka reguła ogranicza systematyczne przesuwanie wyników w jedną stronę. Jeśli jednak specyfikacja wymaga zaokrąglania połówek od zera, domyślny wynik może nie pasować. Uważam, że właśnie tę różnicę najlepiej sprawdzić przed wyborem metody zaokrąglania, zamiast zakładać, że każda funkcja realizuje szkolną regułę.

Wynik 2.67 dla 2.675 wynika z reprezentacji float

Przykład round(2.675, 2) często wygląda jak błąd funkcji. Przyczyną jest zapis liczby typu float: większości ułamków dziesiętnych nie da się dokładnie przedstawić w systemie binarnym, więc program operuje na najbliższym możliwym przybliżeniu. W tym przypadku wartość przechowywana przez Pythona znajduje się nieco poniżej dziesiętnego 2.675.

round(2.675, 2)  # 2.67

To nie znaczy, że round() ignoruje liczbę miejsc po przecinku. Zaokrągla otrzymaną wartość binarną zgodnie ze swoją regułą. Wyjaśnienie tej pułapki oraz ograniczeń arytmetyki zmiennoprzecinkowej podaje samouczek Pythona o liczbach zmiennoprzecinkowych.

Decimal pozwala jawnie wybrać regułę dla wartości dziesiętnych

Gdy liczy się dziesiętna wartość wejściowa, a nie jej binarne przybliżenie, użyj Decimal. Przekaż liczbę jako tekst: Decimal("2.675") zachowa zapis dziesiętny, podczas gdy przekazanie wcześniej utworzonego float przeniosłoby jego niedokładność do nowego obiektu.

from decimal import Decimal, ROUND_HALF_UP

kwota = Decimal("2.675")
wynik = kwota.quantize(
    Decimal("0.01"),
    rounding=ROUND_HALF_UP
)

print(wynik)  # 2.68

ROUND_HALF_UP zaokrągla remisy od zera, a więc zachowuje się inaczej niż domyślny remis do parzystej wbudowanego round(). Moduł decimal udostępnia też inne tryby, między innymi ROUND_HALF_EVEN oraz ROUND_DOWN. Dokumentacja modułu decimal opisuje metodę quantize(), która ustala wykładnik wyniku, na przykład dwa miejsca po przecinku.

F-string ustawia wygląd wyniku, a nie jego typ liczbowy

Jeśli wynik ma trafić do tabeli, raportu lub komunikatu, często nie potrzebujesz zmieniać wartości liczbowej. Zapis f"{liczba:.2f}" formatuje ją jako tekst z dokładnie dwoma cyframi po przecinku.

cena = 8.5

print(f"{cena:.2f}")  # 8.50

To przydatne, gdy chcesz zachować końcowe zero, którego liczba typu float sama z siebie nie przechowuje jako elementu zapisu. Pamiętaj jednak, że wynikiem formatowania jest str, nie liczba gotowa do dalszych obliczeń; składnię formatu opisuje dokumentacja formatowanych napisów Pythona.

Dobierz metodę do tego, co robisz z wynikiem

Ta sama liczba może wymagać innego podejścia zależnie od tego, czy dalej ją liczysz, czy tylko pokazujesz. Tabela pomaga uniknąć częstej pomyłki: potraktowania formatu tekstowego jak precyzyjnego zaokrąglenia wartości.

Sytuacja Prawdopodobna przyczyna lub skutek Co zrobić
round(2.675, 2) daje 2.67 float przechowuje przybliżenie binarne Jeśli potrzebujesz dziesiętnej reguły, użyj Decimal("2.675")
Po round(8.5, 2) widzisz 8.5, a chcesz 8.50 Liczba nie przechowuje informacji o końcowym zerze Wyświetl ją przez f"{liczba:.2f}"
Wartość połówkowa zaokrągla się w nieoczekiwaną stronę round() rozstrzyga dokładny remis na korzyść parzystego wyniku Wybierz Decimal i określ wymagany tryb zaokrąglania
Zaokrąglona wartość ma być dalej używana w obliczeniach Formatowanie f-stringiem daje tekst Użyj round() albo Decimal.quantize(), stosownie do wymagań

Najpierw ustal, czy zaokrąglasz wartość, czy jej zapis

Do zwykłych obliczeń i typowych wartości float wybierz round(liczba, ndigits). Gdy potrzebujesz określonej reguły dla wartości dziesiętnych, użyj Decimal; gdy chodzi wyłącznie o czytelny zapis, formatuj wynik f-stringiem. Najpierw określ oczekiwany rezultat, potem dobierz narzędzie, bo dwa miejsca po przecinku mogą oznaczać precyzję liczby albo tylko wygląd tekstu.

FAQ - Najczęstsze pytania

Drugi argument określa liczbę miejsc po przecinku, więc round(3.14159, 2) zwraca 3.14. Bez ndigits funkcja zaokrągla do liczby całkowitej, a wartość ujemna zaokrągla większe rzędy, na przykład round(1234, -2) zwraca 1200.

Wartość typu float jest przechowywana jako binarne przybliżenie liczby dziesiętnej. W przypadku 2.675 zapis używany przez Pythona znajduje się nieco poniżej tej wartości, dlatego round() zaokrągla go do 2.67.

Przy dokładnym remisie wbudowane round() wybiera bliższą wartość parzystą. Dlatego round(2.5) daje 2, round(3.5) daje 4, a round(1.25, 1) zwraca 1.2.

Użyj Decimal, gdy potrzebujesz kontrolować dziesiętną wartość wejściową i jawnie wybrać regułę zaokrąglania. Utworzenie Decimal("2.675") z tekstu oraz użycie quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) daje wynik 2.68; przekazanie wcześniejszego float przeniosłoby jego niedokładność.

Zapis f"{liczba:.2f}" formatuje wynik jako tekst, więc dla wartości 8.5 wyświetli 8.50. F-string służy do prezentacji i zwraca typ str, dlatego nie powinien zastępować liczbowego zaokrąglania, jeśli wynik ma być dalej używany w obliczeniach.

Oceń artykuł

Ocena: 4.10 Liczba głosów: 10

Tagi

decimal
float
zaokrąglanie
f-string
Autor Radosław Stępień
Radosław Stępień
Dziedzina programowania i technologii rozwija się w zawrotnym tempie, co sprawia, że ciągłe śledzenie nowinek i głębokie zrozumienie procesów są kluczowe. Nazywam się Radosław Stępień i od 13 lat aktywnie działam w branży IT, dzieląc się swoją wiedzą i doświadczeniem. Moje zainteresowania skupiają się na praktycznych aspektach tworzenia oprogramowania, analizie trendów technologicznych oraz budowaniu satysfakcjonującej ścieżki kariery w tym dynamicznym sektorze. Staram się przedstawiać złożone zagadnienia w sposób przystępny, opierając się na sprawdzonych informacjach i własnych obserwacjach z wieloletniej pracy. Zależy mi na tym, aby treści, które tworzę, były nie tylko merytoryczne i aktualne, ale przede wszystkim pomocne dla każdego, kto chce zgłębić tajniki IT lub rozwijać się zawodowo.

Udostępnij artykuł

Napisz komentarz