Hogyan kerekítsünk?

Az előző bejegyzésben a nagy számítási pontosságot igénylő alkalmazásokhoz a szabványos könyvtár decimal modulját használtuk, és láthattuk példákon, hogy mi a hatása, ha a kívánt pontosságot a kontextusobjektumon keresztül változtatjuk.

Az értékes jegyek számának meghatározása szükséges, de általában nem elégséges feltétele az előírt pontosság eléréséhez. A teljes képhez a kerekítési módszer meghatározása szükséges, ugyanis számos elvet követve kerekíthetünk számokat.

Tegyük fel például, hogy egy cég a bruttó fogyasztói árait akarja meghatározni euróban két tizedesjegy pontossággal. Az áfakulccsal szorozva a nettót kettőnél több tizedesjegy jöhet ki. Ilyenkor kérdés, hogyan kerekítsen. A cégek általában árak tekintetében mindig felfelé kerekítenek. Tehát nekik egy „mindig felfelé” módszer kell. Ugyanakkor egy szigorú tanár a tantárgyátlagot, vagy egy, a költségkeretre ügyelő főnök a kiszámolt prémiumot következetesen lefelé kerekíti. Ők tehát egy „mindig lefelé” kerekítési stratégiát követnek. Ezzel szemben a pénzügyi szakemberek ügyelnek a minél nagyobb pontosságra, amikor pénzügyi kimutatásokat készítenek sok számadatból. Ők megint egy másik kerekítési módszert részesítenek előnyben, amit nem véletlenül bankár kerekítésnek is szoktak nevezni, mert nagy számosságú számhalmaz esetén átlagosan kisebb eltérést eredményez az egzakt értéktől, mint más módszerek.

A decimal modul lehetővé teszi nem csak az előbb említett kerekítési módszerek alkalmazását, hanem másokat is. A használathoz az aktuális kontextusobjektum rounding attribútumának kell az alább felsorolt modulkonstansok valamelyikét értékül adni. A konstansok neve a kerekítési módszerek általánosan elfogadott angol nevei is egyben. Ezek az eljárások egy decimális számítási művelet eredményét kerekítik az aktuális pontossághoz igazodva különböző elvek alapján.

ROUND_UP: kerekítés mindig a nullától távolodó irányba.

ROUND_DOWN: Más néven csonkolás. Kerekítés mindig a nulla irányába.

ROUND_CEILING: kerekítés mindig a pozitív végtelen irányába.

ROUND_FLOOR: kerekítés mindig a negatív végtelen irányába.

ROUND_HALF_UP: Ha az első elhagyott számjegy kisebb, mint 5, akkor ROUND_DOWN, ha nagyobb egyenlő, mint 5, akkor ROUND_UP.

ROUND_HALF_DOWN: Ha az első elhagyott számjegy kisebb, mint 5, akkor ROUND_DOWN, ha nagyobb, mint 5, akkor ROUND_UP, ha egyenlő 5 és utána nem csupa 0 áll, akkor ROUND_UP, ha egyenlő 5 és utána minden jegy 0, akkor ROUND_DOWN.

ROUND_HALF_EVEN: Más néven bankár kerekítés. Ha az első elhagyott számjegy kisebb, mint 5, akkor ROUND_DOWN, nagyobb, mint 5, akkor ROUND_UP, egyenlő 5 és utána nem csupa 0 áll, akkor ROUND_UP, ha egyenlő 5 és utána minden jegy 0, akkor úgy kerekít, hogy a kapott szám utolsó jegye páros legyen.

ROUND_05UP: A kerekítési mód ROUND_DOWN, kivéve ha így a kerekítés utáni utolsó számjegy 0 vagy 5 lenne, mert akkor ROUND_UP.

Az alább látható programkód az egyes kerekítési stratégiák hatását mutatja.

Mivel az egyes kerekítési módok elvének és használatának megértése nem biztos, hogy mindenkinek egyszerű, ezért a Python tudásépítés lépésről lépésre című e-könyv a működési elveket ábrákon és példaprogramokon keresztül részletesen ismerteti.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.