{"id":1533,"date":"2026-04-20T15:58:21","date_gmt":"2026-04-20T13:58:21","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1533"},"modified":"2026-04-28T16:03:51","modified_gmt":"2026-04-28T14:03:51","slug":"round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/20\/round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku\/","title":{"rendered":"Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Precyzja liczb w programowaniu bardzo szybko przestaje by\u0107 drobiazgiem, gdy wynik trafia do faktury, raportu sprzeda\u017cy, systemu magazynowego albo oblicze\u0144 in\u017cynierskich. R\u00f3\u017cnica mi\u0119dzy 12,344 a 12,34 mo\u017ce oznacza\u0107 poprawne rozliczenie albo reklamacj\u0119 od klienta. Problem nie dotyczy wy\u0142\u0105cznie estetyki wy\u015bwietlania warto\u015bci, ale tak\u017ce logiki biznesowej, por\u00f3wna\u0144 i dalszych oblicze\u0144. W praktyce jednym z najcz\u0119\u015bciej u\u017cywanych mechanizm\u00f3w jest Round, funkcja zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-i-dlatego-wynik-nie-zawsze-jest-intuicyjny\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku i dlatego wynik nie zawsze jest intuicyjny<\/a><ol><li><a href=\"#podstawowe-reguly-matematyczne-zaokraglania\">Podstawowe regu\u0142y matematyczne zaokr\u0105glania<\/a><\/li><li><a href=\"#najczesciej-uzywany-zapis-matematyczny\">Najcz\u0119\u015bciej u\u017cywany zapis matematyczny<\/a><\/li><\/ol><\/li><li><a href=\"#roznica-miedzy-zaokraglaniem-wartosci-a-formatowaniem-wyniku-na-ekranie\">R\u00f3\u017cnica mi\u0119dzy zaokr\u0105glaniem warto\u015bci a formatowaniem wyniku na ekranie<\/a><\/li><li><a href=\"#round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-w-c-c-i-python-w-troche-inny-sposob\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku w C, C++ i Python w troch\u0119 inny spos\u00f3b<\/a><ol><li><a href=\"#python\">Python<\/a><\/li><li><a href=\"#wynik\">Wynik<\/a><\/li><li><a href=\"#c\">C<\/a><\/li><li><a href=\"#c-1\">C++<\/a><\/li><li><a href=\"#reczne-zaokraglenie-przez-mnozenie-i-dzielenie\">R\u0119czne zaokr\u0105glenie przez mno\u017cenie i dzielenie<\/a><\/li><\/ol><\/li><li><a href=\"#problem-liczb-zmiennoprzecinkowych-i-sytuacje-w-ktorych-wynik-wyglada-na-bledny\">Problem liczb zmiennoprzecinkowych i sytuacje, w kt\u00f3rych wynik wygl\u0105da na b\u0142\u0119dny<\/a><\/li><li><a href=\"#round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-ale-w-finansach-obowiazuja-dodatkowe-zasady\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku ale w finansach obowi\u0105zuj\u0105 dodatkowe zasady<\/a><\/li><li><a href=\"#najczestsze-bledy-praktyczne-i-miejsca-gdzie-zaokraglanie-psuje-wynik-koncowy\">Najcz\u0119stsze b\u0142\u0119dy praktyczne i miejsca, gdzie zaokr\u0105glanie psuje wynik ko\u0144cowy<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#dlaczego-round-2-5-moze-zwrocic-2-zamiast-3\">Dlaczego round(2.5) mo\u017ce zwr\u00f3ci\u0107 2 zamiast 3?<\/a><\/li><li><a href=\"#czy-format-2-f-oznacza-prawdziwe-zaokraglenie\">Czy format %.2f oznacza prawdziwe zaokr\u0105glenie?<\/a><\/li><li><a href=\"#czy-float-nadaje-sie-do-systemu-faktur\">Czy float nadaje si\u0119 do systemu faktur?<\/a><\/li><li><a href=\"#kiedy-uzywac-parametru-ujemnego-w-zaokraglaniu\">Kiedy u\u017cywa\u0107 parametru ujemnego w zaokr\u0105glaniu?<\/a><\/li><li><a href=\"#dlaczego-suma-pozycji-nie-zgadza-sie-z-wartoscia-koncowa-faktury\">Dlaczego suma pozycji nie zgadza si\u0119 z warto\u015bci\u0105 ko\u0144cow\u0105 faktury?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-i-dlatego-wynik-nie-zawsze-jest-intuicyjny\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku i dlatego wynik nie zawsze jest intuicyjny<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zaokr\u0105glanie liczby polega na sprowadzeniu jej do kr\u00f3tszej, wygodniejszej postaci przy zachowaniu mo\u017cliwie ma\u0142ego b\u0142\u0119du. Najcz\u0119\u015bciej chodzi o ograniczenie liczby cyfr po przecinku, ale r\u00f3wnie cz\u0119sto zaokr\u0105gla si\u0119 do pe\u0142nych dziesi\u0105tek, setek albo tysi\u0119cy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla przyk\u0142adu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>12,3456 \u2192 12,35 przy dok\u0142adno\u015bci do dw\u00f3ch miejsc<\/li>\n\n\n\n<li>98,4 \u2192 98 przy zaokr\u0105gleniu do liczby ca\u0142kowitej<\/li>\n\n\n\n<li>1548 \u2192 1500 przy zaokr\u0105gleniu do setek<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Na pierwszy rzut oka regu\u0142a wydaje si\u0119 prosta: je\u015bli kolejna cyfra jest wi\u0119ksza lub r\u00f3wna 5, zwi\u0119kszamy poprzedni\u0105 cyfr\u0119 o 1. Problem zaczyna si\u0119 wtedy, gdy komputer przechowuje liczby zmiennoprzecinkowe binarnie, a nie dziesi\u0119tnie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warto\u015b\u0107 2.675 w pami\u0119ci cz\u0119sto nie jest dok\u0142adnie 2.675, ale czym\u015b bardzo bliskim, na przyk\u0142ad 2.674999999. Wtedy wynik zaokr\u0105glenia mo\u017ce zaskoczy\u0107 u\u017cytkownika.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"podstawowe-reguly-matematyczne-zaokraglania\">Podstawowe regu\u0142y matematyczne zaokr\u0105glania<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przypadek<\/th><th>Wynik<\/th><th>Wyja\u015bnienie<\/th><\/tr><\/thead><tbody><tr><td>4,44 \u2192 1 miejsce<\/td><td>4,4<\/td><td>kolejna cyfra to 4<\/td><\/tr><tr><td>4,45 \u2192 1 miejsce<\/td><td>4,5<\/td><td>kolejna cyfra to 5<\/td><\/tr><tr><td>19,995 \u2192 2 miejsca<\/td><td>20,00<\/td><td>przeniesienie do cz\u0119\u015bci ca\u0142kowitej<\/td><\/tr><tr><td>149 \u2192 do dziesi\u0105tek<\/td><td>150<\/td><td>ko\u0144c\u00f3wka 9 podnosi warto\u015b\u0107<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"najczesciej-uzywany-zapis-matematyczny\">Najcz\u0119\u015bciej u\u017cywany zapis matematyczny<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zapis<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>round(x)<\/td><td>zaokr\u0105glenie do liczby ca\u0142kowitej<\/td><\/tr><tr><td>round(x, n)<\/td><td>zaokr\u0105glenie do n miejsc po przecinku<\/td><\/tr><tr><td>round(1234, -2)<\/td><td>zaokr\u0105glenie do setek<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W wielu j\u0119zykach programowania parametr ujemny oznacza w\u0142a\u015bnie zaokr\u0105glanie \u201ew lewo\u201d, czyli do dziesi\u0105tek, setek lub tysi\u0119cy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"roznica-miedzy-zaokraglaniem-wartosci-a-formatowaniem-wyniku-na-ekranie\">R\u00f3\u017cnica mi\u0119dzy zaokr\u0105glaniem warto\u015bci a formatowaniem wyniku na ekranie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To rozr\u00f3\u017cnienie jest cz\u0119sto pomijane, a p\u00f3\u017aniej prowadzi do b\u0142\u0119d\u00f3w trudnych do znalezienia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zaokr\u0105glenie zmienia warto\u015b\u0107 u\u017cywan\u0105 dalej w programie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formatowanie zmienia tylko spos\u00f3b prezentacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi w Pythonie zapisze si\u0119 liczb\u0119:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Efekt<\/th><\/tr><\/thead><tbody><tr><td><code>x = 12.3456<\/code><\/td><td>warto\u015b\u0107 pe\u0142na<\/td><\/tr><tr><td><code>print(f\"{x:.2f}\")<\/code><\/td><td>na ekranie: 12.35<\/td><\/tr><tr><td><code>print(x)<\/code><\/td><td>nadal: 12.3456<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Programista mo\u017ce b\u0142\u0119dnie uzna\u0107, \u017ce warto\u015b\u0107 zosta\u0142a zmieniona, podczas gdy jedynie jej wy\u015bwietlenie zosta\u0142o skr\u00f3cone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W systemach finansowych to bardzo niebezpieczne. Raport mo\u017ce pokazywa\u0107 12,35, ale dalsze obliczenia wykonywane s\u0105 na 12,3456 i suma ko\u0144cowa przestaje si\u0119 zgadza\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego trzeba \u015bwiadomie rozdziela\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>logik\u0119 oblicze\u0144<\/li>\n\n\n\n<li>spos\u00f3b prezentacji danych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To nie jest detal stylistyczny, tylko kwestia poprawno\u015bci systemu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-w-c-c-i-python-w-troche-inny-sposob\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku w C, C++ i Python w troch\u0119 inny spos\u00f3b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cne j\u0119zyki maj\u0105 podobn\u0105 ide\u0119, ale szczeg\u00f3\u0142y implementacji nie s\u0105 identyczne. Szczeg\u00f3lnie wa\u017cne s\u0105 liczby graniczne oraz spos\u00f3b traktowania warto\u015bci ko\u0144cz\u0105cych si\u0119 na .5.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"python\">Python<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>round()<\/code> jest wbudowana i bardzo cz\u0119sto u\u017cywana.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>do liczby ca\u0142kowitej<\/td><td><code>print(round(7.8))<\/code><\/td><\/tr><tr><td>do 2 miejsc<\/td><td><code>print(round(3.14159, 2))<\/code><\/td><\/tr><tr><td>do setek<\/td><td><code>print(round(1548, -2))<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wynik\">Wynik<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wyra\u017cenie<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>round(7.8)<\/code><\/td><td>8<\/td><\/tr><tr><td><code>round(3.14159, 2)<\/code><\/td><td>3.14<\/td><\/tr><tr><td><code>round(1548, -2)<\/code><\/td><td>1500<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Python stosuje tzw. banker&#8217;s rounding w niekt\u00f3rych przypadkach:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>round(2.5)<\/code><\/td><td>2<\/td><\/tr><tr><td><code>round(3.5)<\/code><\/td><td>4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To zaskakuje pocz\u0105tkuj\u0105cych, ale ma sens statystyczny przy du\u017cej liczbie operacji finansowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c\">C<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W j\u0119zyku C najcz\u0119\u015bciej u\u017cywa si\u0119 funkcji <code>round()<\/code> z biblioteki <code>math.h<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>zaokr\u0105glenie<\/td><td><code>double x = 3.76;<\/code><br><code>printf(\"%.0f\", round(x));<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-1\">C++<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ sytuacja jest podobna, zwykle z u\u017cyciem <code>&lt;cmath&gt;<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>zaokr\u0105glenie<\/td><td><code>double x = 8.49;<\/code><br><code>cout &lt;&lt; round(x);<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"reczne-zaokraglenie-przez-mnozenie-i-dzielenie\">R\u0119czne zaokr\u0105glenie przez mno\u017cenie i dzielenie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sto spotykany szkolny zapis:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod C++<\/th><th>Dzia\u0142anie<\/th><\/tr><\/thead><tbody><tr><td><code>double x = 3.14159;<\/code><br><code>x = round(x * 100) \/ 100;<\/code><\/td><td>2 miejsca po przecinku<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>mno\u017cenie przez 100<\/li>\n\n\n\n<li>zaokr\u0105glenie do ca\u0142kowitej<\/li>\n\n\n\n<li>podzia\u0142 przez 100<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">To rozwi\u0105zanie jest proste i czytelne, ale przy bardzo du\u017cych liczbach mo\u017ce generowa\u0107 b\u0142\u0119dy precyzji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"problem-liczb-zmiennoprzecinkowych-i-sytuacje-w-ktorych-wynik-wyglada-na-bledny\">Problem liczb zmiennoprzecinkowych i sytuacje, w kt\u00f3rych wynik wygl\u0105da na b\u0142\u0119dny<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Komputer nie przechowuje wi\u0119kszo\u015bci liczb dziesi\u0119tnych dok\u0142adnie. Dzia\u0142a na reprezentacji binarnej, podobnie jak u\u0142amek 1\/3 w systemie dziesi\u0119tnym nie ma sko\u0144czonego rozwini\u0119cia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>print(0.1 + 0.2)<\/code><\/td><td><code>0.30000000000000004<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To nie jest b\u0142\u0105d funkcji, tylko spos\u00f3b reprezentacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tak samo:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td><code>print(round(2.675, 2))<\/code><\/td><td><code>2.67<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cytkownik oczekuje 2.68, ale komputer operuje na warto\u015bci nieco mniejszej ni\u017c 2.675.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W ksi\u0119gowo\u015bci i systemach p\u0142atno\u015bci cz\u0119sto stosuje si\u0119 typy dziesi\u0119tne zamiast zwyk\u0142ych <code>float<\/code> lub <code>double<\/code>, w\u0142a\u015bnie po to, \u017ceby unikn\u0105\u0107 takich sytuacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie u\u017cywa si\u0119 wtedy modu\u0142u <code>decimal<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>dok\u0142adniejsze obliczenia<\/td><td><code>from decimal import Decimal<\/code><br><code>x = Decimal(\"2.675\")<\/code><br><code>print(x)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Warto\u015b\u0107 zapisana jako tekst daje wi\u0119ksz\u0105 kontrol\u0119 nad precyzj\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"round-zaokragla-liczbe-do-okreslonej-liczby-miejsc-po-przecinku-ale-w-finansach-obowiazuja-dodatkowe-zasady\">Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku ale w finansach obowi\u0105zuj\u0105 dodatkowe zasady<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W systemach sprzeda\u017cy i ksi\u0119gowo\u015bci nie wystarczy u\u017cy\u0107 funkcji i uzna\u0107 temat za zamkni\u0119ty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeba odpowiedzie\u0107 na kilka pyta\u0144:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czy zaokr\u0105glamy ka\u017cd\u0105 pozycj\u0119 osobno<\/li>\n\n\n\n<li>czy najpierw sumujemy, a potem zaokr\u0105glamy<\/li>\n\n\n\n<li>czy VAT liczymy od pozycji czy od ca\u0142o\u015bci<\/li>\n\n\n\n<li>czy stosujemy standard handlowy czy bankowy<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dwie poprawne implementacje mog\u0105 da\u0107 r\u00f3\u017cne wyniki ko\u0144cowe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pozycje<\/th><th>Wariant A<\/th><th>Wariant B<\/th><\/tr><\/thead><tbody><tr><td>3 \u00d7 3,335<\/td><td>ka\u017cda pozycja \u2192 3,34<\/td><td>suma \u2192 10,005<\/td><\/tr><tr><td>wynik ko\u0144cowy<\/td><td>10,02<\/td><td>10,01<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnica jednego grosza w pojedynczym dokumencie wydaje si\u0119 ma\u0142a, ale przy 50 000 transakcji miesi\u0119cznie oznacza realny problem rozliczeniowy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego system powinien mie\u0107 jasno opisan\u0105 polityk\u0119 zaokr\u0105gle\u0144, a nie \u201edomy\u015blne round()\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To jeden z tych obszar\u00f3w, gdzie programista traci najwi\u0119cej czasu na poprawki po wdro\u017ceniu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-bledy-praktyczne-i-miejsca-gdzie-zaokraglanie-psuje-wynik-koncowy\">Najcz\u0119stsze b\u0142\u0119dy praktyczne i miejsca, gdzie zaokr\u0105glanie psuje wynik ko\u0144cowy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwszy b\u0142\u0105d to zbyt wczesne zaokr\u0105glanie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi po ka\u017cdym kroku oblicze\u0144 obcinamy wynik do dw\u00f3ch miejsc po przecinku, b\u0142\u0105d narasta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lepsza praktyka:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>liczy\u0107 na pe\u0142nej precyzji<\/li>\n\n\n\n<li>zaokr\u0105gla\u0107 dopiero na ko\u0144cu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi b\u0142\u0105d to por\u00f3wnywanie liczb zmiennoprzecinkowych operatorem <code>==<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Z\u0142y zapis<\/th><th>Lepszy zapis<\/th><\/tr><\/thead><tbody><tr><td><code>if x == 0.3<\/code><\/td><td><code>if abs(x - 0.3) &lt; 0.0001<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeci b\u0142\u0105d to mieszanie prezentacji z logik\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formatowanie tekstowe nie powinno decydowa\u0107 o poprawno\u015bci oblicze\u0144.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czwarty b\u0142\u0105d to brak test\u00f3w granicznych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>0.005<\/li>\n\n\n\n<li>2.675<\/li>\n\n\n\n<li>19.995<\/li>\n\n\n\n<li>999.995<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To w\u0142a\u015bnie takie liczby najcz\u0119\u015bciej ujawniaj\u0105 problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce warto mie\u0107 osobny zestaw test\u00f3w tylko dla mechanizmu zaokr\u0105glania.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-round-2-5-moze-zwrocic-2-zamiast-3\">Dlaczego <code>round(2.5)<\/code> mo\u017ce zwr\u00f3ci\u0107 2 zamiast 3?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Niekt\u00f3re j\u0119zyki stosuj\u0105 zaokr\u0105glanie bankowe. Liczba ko\u0144cz\u0105ca si\u0119 na <code>.5<\/code> jest kierowana do najbli\u017cszej liczby parzystej. Dzi\u0119ki temu przy du\u017cej liczbie operacji nie powstaje systematyczne zawy\u017canie wynik\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-format-2-f-oznacza-prawdziwe-zaokraglenie\">Czy format <code>%.2f<\/code> oznacza prawdziwe zaokr\u0105glenie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie zawsze. Najcz\u0119\u015bciej oznacza spos\u00f3b wy\u015bwietlenia warto\u015bci. Sama liczba w pami\u0119ci mo\u017ce nadal mie\u0107 wi\u0119cej cyfr po przecinku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-float-nadaje-sie-do-systemu-faktur\">Czy <code>float<\/code> nadaje si\u0119 do systemu faktur?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Do prostych przypadk\u00f3w czasem tak, ale bezpieczniej stosowa\u0107 typy dziesi\u0119tne lub rozwi\u0105zania oparte na liczbach ca\u0142kowitych, na przyk\u0142ad przechowywanie kwoty w groszach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-uzywac-parametru-ujemnego-w-zaokraglaniu\">Kiedy u\u017cywa\u0107 parametru ujemnego w zaokr\u0105glaniu?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy trzeba zaokr\u0105gli\u0107 do dziesi\u0105tek, setek lub tysi\u0119cy, na przyk\u0142ad raport sprzeda\u017cy miesi\u0119cznej albo statystyki magazynowe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-suma-pozycji-nie-zgadza-sie-z-wartoscia-koncowa-faktury\">Dlaczego suma pozycji nie zgadza si\u0119 z warto\u015bci\u0105 ko\u0144cow\u0105 faktury?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej przez r\u00f3\u017cnic\u0119 mi\u0119dzy zaokr\u0105glaniem ka\u017cdej pozycji osobno a zaokr\u0105gleniem ca\u0142ej sumy na ko\u0144cu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zaokr\u0105glanie wygl\u0105da na prost\u0105 operacj\u0119, ale bardzo szybko staje si\u0119 elementem krytycznym dla jako\u015bci programu. B\u0142\u0119dy pojawiaj\u0105 si\u0119 nie dlatego, \u017ce funkcja jest trudna, ale dlatego, \u017ce decyzja o momencie i sposobie zaokr\u0105glenia wp\u0142ywa na ca\u0142y system. W raportach jeszcze da si\u0119 to zauwa\u017cy\u0107, w ksi\u0119gowo\u015bci zwykle zauwa\u017ca to klient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Precyzja liczb w programowaniu bardzo szybko przestaje by\u0107 drobiazgiem, gdy wynik trafia do faktury, raportu sprzeda\u017cy, systemu magazynowego albo oblicze\u0144 in\u017cynierskich. R\u00f3\u017cnica mi\u0119dzy 12,344 a 12,34 mo\u017ce oznacza\u0107 poprawne rozliczenie albo reklamacj\u0119 od klienta. Problem nie dotyczy wy\u0142\u0105cznie estetyki wy\u015bwietlania warto\u015bci, ale tak\u017ce logiki biznesowej, por\u00f3wna\u0144 i dalszych oblicze\u0144. W praktyce jednym z najcz\u0119\u015bciej u\u017cywanych mechanizm\u00f3w jest Round, funkcja zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku. Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku i dlatego wynik nie zawsze jest intuicyjny Zaokr\u0105glanie liczby polega na sprowadzeniu jej do kr\u00f3tszej, wygodniejszej postaci przy zachowaniu mo\u017cliwie ma\u0142ego b\u0142\u0119du. Najcz\u0119\u015bciej chodzi o ograniczenie liczby cyfr po przecinku, ale r\u00f3wnie cz\u0119sto zaokr\u0105gla si\u0119 do pe\u0142nych dziesi\u0105tek, setek albo tysi\u0119cy. Dla przyk\u0142adu: Na pierwszy rzut oka regu\u0142a wydaje si\u0119 prosta: je\u015bli kolejna cyfra jest wi\u0119ksza lub r\u00f3wna 5, zwi\u0119kszamy poprzedni\u0105 cyfr\u0119 o 1. Problem zaczyna si\u0119 wtedy, gdy komputer przechowuje liczby zmiennoprzecinkowe binarnie, a nie dziesi\u0119tnie. Warto\u015b\u0107 2.675 w pami\u0119ci cz\u0119sto nie jest dok\u0142adnie 2.675, ale czym\u015b bardzo bliskim, na przyk\u0142ad 2.674999999. Wtedy wynik zaokr\u0105glenia mo\u017ce zaskoczy\u0107 u\u017cytkownika. Podstawowe regu\u0142y matematyczne zaokr\u0105glania Przypadek Wynik Wyja\u015bnienie 4,44 \u2192 1 miejsce 4,4 kolejna cyfra to 4 4,45 \u2192 1 miejsce 4,5 kolejna cyfra to 5 19,995 \u2192 2 miejsca 20,00 przeniesienie do cz\u0119\u015bci ca\u0142kowitej 149 \u2192 do dziesi\u0105tek 150 ko\u0144c\u00f3wka 9 podnosi warto\u015b\u0107 Najcz\u0119\u015bciej u\u017cywany zapis matematyczny Zapis Znaczenie round(x) zaokr\u0105glenie do liczby ca\u0142kowitej round(x, n) zaokr\u0105glenie do n miejsc po przecinku round(1234, -2) zaokr\u0105glenie do setek W wielu j\u0119zykach programowania parametr ujemny oznacza w\u0142a\u015bnie zaokr\u0105glanie \u201ew lewo\u201d, czyli do dziesi\u0105tek, setek lub tysi\u0119cy. R\u00f3\u017cnica mi\u0119dzy zaokr\u0105glaniem warto\u015bci a formatowaniem wyniku na ekranie To rozr\u00f3\u017cnienie jest cz\u0119sto pomijane, a p\u00f3\u017aniej prowadzi do b\u0142\u0119d\u00f3w trudnych do znalezienia. Zaokr\u0105glenie zmienia warto\u015b\u0107 u\u017cywan\u0105 dalej w programie. Formatowanie zmienia tylko spos\u00f3b prezentacji. Je\u017celi w Pythonie zapisze si\u0119 liczb\u0119: Kod Efekt x = 12.3456 warto\u015b\u0107 pe\u0142na print(f&#8221;{x:.2f}&#8221;) na ekranie: 12.35 print(x) nadal: 12.3456 Programista mo\u017ce b\u0142\u0119dnie uzna\u0107, \u017ce warto\u015b\u0107 zosta\u0142a zmieniona, podczas gdy jedynie jej wy\u015bwietlenie zosta\u0142o skr\u00f3cone. W systemach finansowych to bardzo niebezpieczne. Raport mo\u017ce pokazywa\u0107 12,35, ale dalsze obliczenia wykonywane s\u0105 na 12,3456 i suma ko\u0144cowa przestaje si\u0119 zgadza\u0107. Dlatego trzeba \u015bwiadomie rozdziela\u0107: To nie jest detal stylistyczny, tylko kwestia poprawno\u015bci systemu. Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku w C, C++ i Python w troch\u0119 inny spos\u00f3b R\u00f3\u017cne j\u0119zyki maj\u0105 podobn\u0105 ide\u0119, ale szczeg\u00f3\u0142y implementacji nie s\u0105 identyczne. Szczeg\u00f3lnie wa\u017cne s\u0105 liczby graniczne oraz spos\u00f3b traktowania warto\u015bci ko\u0144cz\u0105cych si\u0119 na .5. Python Funkcja round() jest wbudowana i bardzo cz\u0119sto u\u017cywana. Przyk\u0142ad Kod do liczby ca\u0142kowitej print(round(7.8)) do 2 miejsc print(round(3.14159, 2)) do setek print(round(1548, -2)) Wynik Wyra\u017cenie Wynik round(7.8) 8 round(3.14159, 2) 3.14 round(1548, -2) 1500 Python stosuje tzw. banker&#8217;s rounding w niekt\u00f3rych przypadkach: Kod Wynik round(2.5) 2 round(3.5) 4 To zaskakuje pocz\u0105tkuj\u0105cych, ale ma sens statystyczny przy du\u017cej liczbie operacji finansowych. C W j\u0119zyku C najcz\u0119\u015bciej u\u017cywa si\u0119 funkcji round() z biblioteki math.h. Przyk\u0142ad Kod zaokr\u0105glenie double x = 3.76;printf(&#8222;%.0f&#8221;, round(x)); C++ W C++ sytuacja jest podobna, zwykle z u\u017cyciem &lt;cmath&gt;. Przyk\u0142ad Kod zaokr\u0105glenie double x = 8.49;cout &lt;&lt; round(x); R\u0119czne zaokr\u0105glenie przez mno\u017cenie i dzielenie Cz\u0119sto spotykany szkolny zapis: Kod C++ Dzia\u0142anie double x = 3.14159;x = round(x * 100) \/ 100; 2 miejsca po przecinku Mechanizm: To rozwi\u0105zanie jest proste i czytelne, ale przy bardzo du\u017cych liczbach mo\u017ce generowa\u0107 b\u0142\u0119dy precyzji. Problem liczb zmiennoprzecinkowych i sytuacje, w kt\u00f3rych wynik wygl\u0105da na b\u0142\u0119dny Komputer nie przechowuje wi\u0119kszo\u015bci liczb dziesi\u0119tnych dok\u0142adnie. Dzia\u0142a na reprezentacji binarnej, podobnie jak u\u0142amek 1\/3 w systemie dziesi\u0119tnym nie ma sko\u0144czonego rozwini\u0119cia. Przyk\u0142ad: Kod Python Wynik print(0.1 + 0.2) 0.30000000000000004 To nie jest b\u0142\u0105d funkcji, tylko spos\u00f3b reprezentacji. Tak samo: Kod Python Wynik print(round(2.675, 2)) 2.67 U\u017cytkownik oczekuje 2.68, ale komputer operuje na warto\u015bci nieco mniejszej ni\u017c 2.675. W ksi\u0119gowo\u015bci i systemach p\u0142atno\u015bci cz\u0119sto stosuje si\u0119 typy dziesi\u0119tne zamiast zwyk\u0142ych float lub double, w\u0142a\u015bnie po to, \u017ceby unikn\u0105\u0107 takich sytuacji. W Pythonie u\u017cywa si\u0119 wtedy modu\u0142u decimal. Przyk\u0142ad Kod dok\u0142adniejsze obliczenia from decimal import Decimalx = Decimal(&#8222;2.675&#8221;)print(x) Warto\u015b\u0107 zapisana jako tekst daje wi\u0119ksz\u0105 kontrol\u0119 nad precyzj\u0105. Round \u2013 zaokr\u0105gla liczb\u0119 do okre\u015blonej liczby miejsc po przecinku ale w finansach obowi\u0105zuj\u0105 dodatkowe zasady W systemach sprzeda\u017cy i ksi\u0119gowo\u015bci nie wystarczy u\u017cy\u0107 funkcji i uzna\u0107 temat za zamkni\u0119ty. Trzeba odpowiedzie\u0107 na kilka pyta\u0144: Dwie poprawne implementacje mog\u0105 da\u0107 r\u00f3\u017cne wyniki ko\u0144cowe. Przyk\u0142ad: Pozycje Wariant A Wariant B 3 \u00d7 3,335 ka\u017cda pozycja \u2192 3,34 suma \u2192 10,005 wynik ko\u0144cowy 10,02 10,01 R\u00f3\u017cnica jednego grosza w pojedynczym dokumencie wydaje si\u0119 ma\u0142a, ale przy 50 000 transakcji miesi\u0119cznie oznacza realny problem rozliczeniowy. Dlatego system powinien mie\u0107 jasno opisan\u0105 polityk\u0119 zaokr\u0105gle\u0144, a nie \u201edomy\u015blne round()\u201d. To jeden z tych obszar\u00f3w, gdzie programista traci najwi\u0119cej czasu na poprawki po wdro\u017ceniu. Najcz\u0119stsze b\u0142\u0119dy praktyczne i miejsca, gdzie zaokr\u0105glanie psuje wynik ko\u0144cowy Pierwszy b\u0142\u0105d to zbyt wczesne zaokr\u0105glanie. Je\u017celi po ka\u017cdym kroku oblicze\u0144 obcinamy wynik do dw\u00f3ch miejsc po przecinku, b\u0142\u0105d narasta. Lepsza praktyka: Drugi b\u0142\u0105d to por\u00f3wnywanie liczb zmiennoprzecinkowych operatorem ==. Z\u0142y zapis Lepszy zapis if x == 0.3 if abs(x &#8211; 0.3) &lt; 0.0001 Trzeci b\u0142\u0105d to mieszanie prezentacji z logik\u0105. Formatowanie tekstowe nie powinno decydowa\u0107 o poprawno\u015bci oblicze\u0144. Czwarty b\u0142\u0105d to brak test\u00f3w granicznych: To w\u0142a\u015bnie takie liczby najcz\u0119\u015bciej ujawniaj\u0105 problem. W praktyce warto mie\u0107 osobny zestaw test\u00f3w tylko dla mechanizmu zaokr\u0105glania. FAQ Dlaczego round(2.5) mo\u017ce zwr\u00f3ci\u0107 2 zamiast 3? Niekt\u00f3re j\u0119zyki stosuj\u0105 zaokr\u0105glanie bankowe. Liczba ko\u0144cz\u0105ca si\u0119 na .5 jest kierowana do najbli\u017cszej liczby parzystej. Dzi\u0119ki temu przy du\u017cej liczbie operacji nie powstaje systematyczne zawy\u017canie wynik\u00f3w. Czy format %.2f oznacza prawdziwe zaokr\u0105glenie? Nie zawsze. Najcz\u0119\u015bciej oznacza spos\u00f3b wy\u015bwietlenia warto\u015bci. Sama liczba w pami\u0119ci mo\u017ce nadal mie\u0107 wi\u0119cej cyfr po przecinku. Czy float nadaje si\u0119 do systemu faktur? Do prostych przypadk\u00f3w czasem tak, ale bezpieczniej stosowa\u0107 typy dziesi\u0119tne lub rozwi\u0105zania oparte na liczbach ca\u0142kowitych, na przyk\u0142ad przechowywanie kwoty w groszach. Kiedy u\u017cywa\u0107 parametru ujemnego w zaokr\u0105glaniu? Gdy trzeba zaokr\u0105gli\u0107 do dziesi\u0105tek, setek lub tysi\u0119cy, na przyk\u0142ad raport sprzeda\u017cy miesi\u0119cznej albo statystyki magazynowe. Dlaczego suma pozycji nie zgadza si\u0119 z warto\u015bci\u0105 ko\u0144cow\u0105 faktury? Najcz\u0119\u015bciej przez r\u00f3\u017cnic\u0119 mi\u0119dzy zaokr\u0105glaniem ka\u017cdej pozycji osobno a zaokr\u0105gleniem ca\u0142ej sumy na ko\u0144cu. Zaokr\u0105glanie wygl\u0105da na prost\u0105 operacj\u0119, ale bardzo szybko staje si\u0119 elementem krytycznym dla jako\u015bci programu. B\u0142\u0119dy pojawiaj\u0105 si\u0119 nie dlatego, \u017ce funkcja jest trudna, ale dlatego, \u017ce decyzja o momencie i sposobie zaokr\u0105glenia wp\u0142ywa na ca\u0142y system. W raportach jeszcze da si\u0119 to zauwa\u017cy\u0107, w ksi\u0119gowo\u015bci zwykle zauwa\u017ca to klient. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1534,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1533"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1533\/revisions"}],"predecessor-version":[{"id":1535,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1533\/revisions\/1535"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1534"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}