A bankárok ügyes kerekítési módszere

Hófehérke és a hét törpe a megszokott módon élik életüket. A törpék naponta eljárnak bányászni és a megszerzett kincseket értékesítik. Sikerült olyan felvásárlókat találniuk, akik hosszútávú fix áras szerződéssel, heti kétszeri fizetéssel biztos havi bevételeket generálnak számukra. Azonban nem hagyatkoznak csak erre, hanem az év során próbálják értékesíteni máshol is a bányászott dolgokat, de ez nem minden nap sikerül, ezért csak kb. az év harmadában jutnak jövedelemhez, de sajnos vannak olyan napok, amikor gyenge a kereslet és ezért önköltség alatt, vagyis veszteséggel tudnak csak megszabadulni a készleteiktől.

A törpék jól értenek a bányászáshoz és alapvetően az értékesítéshez is van érzékük, de a matek nem az erősségük. Az egész számokkal még csak-csak tudnak bánni, de a törtekkel már gondjaik vannak. Ez azért gond, mert az éppen aktuális napi bevételt egyenlően kellene hetük között szétosztani. Ez azonban legtöbbször tört érték. Ezért megkérték Hófehérkét, akit szinte házi bankárjuknak tekintettek, hogy ő tegye meg a bevételek egyenlő módon való elosztását. Hófehérke elég jó matekból, nem gond neki a törtekkel való számolás. Viszont tudja, hogy a törpék csak az egész számokat értik. Ezért miután egy adott napi bevételt elosztott héttel, az eredményt egész számra kell kerekítenie. Igen ám, de nem tudja, hogy hogyan, milyen módszerrel tudná a kerekítést úgy elvégezni, hogy összességében legkevesebb eltérés legyen a kerekített értékek és a kifizetések összege között.

De Hófehérkének e feladat nem okoz nagy problémát, mert míg a törpék napközben bányásztak, addig ő – már csak unaloműzésként is – megtanult Pythonban programozni. Ezért tudja, hogy különböző kerekítési módszereket a szabványos könyvtár decimal moduljával tud vizsgálni és elemezni. Írt is egy erre szolgáló programot, amit alább megosztott velünk. A részletes kommentek segítik a megértését.

Hófehérke azt vizsgálta, hogy az egyes kerekítési módszerek alkalmazása esetén a bevételek és kerekített kifizetések eltérése átlagának abszolútértéke éves szinten mekkora.

A kapott eredményekből egyértelművé vált számára, hogy e tekintetben a ROUND_HALF_EVEN nevű teljesít a legjobban. Ezért el is nevezte ezt bankár kerekítésnek (banker’s rounding), amely elnevezés utána az egész világon elterjedt.

Azt is észrevette, hogy ez a kerekítési mód akkor teljesít nagyon jól átlagos eltérés tekintetében a többi módszerhez képest, ha a kerekítendő értékek között minél több az olyan, ahol a kerekítendő számjegy 5.

Vizsgálatai és következtetése alapján most értette meg, hogy a decimal modul alapértelmezett kontextusa, valamint a beépített round() függvény miért ezt a kerekítési módszert használja.

A decimal modul nagyon sok lehetőséget kínál a nagy pontosságot igénylő számítások végzéséhez különféle kontextus (pl. pontosság, kerekítési módok) alkalmazása mellett, de a decimális aritmetika számábrázolási ismeretei is szükségesek a megértéséhez és hatékony használatához. Ezért csupán a Python hivatalos dokumentációjára támaszkodva nem biztos, hogy egyszerű a megtanulása. Éppen ezért a Python tudásépítés lépésről lépésre című e-könyv egy önálló alfejezetet szán e modulnak, és megpróbálja közérthetően tálalni a tudnivalókat számos példával, ábrával és táblázattal segítve a megértést, beleértve természetesen a kerekítési módszereket is. Mindezzel a „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet, „Amikor fontos a pontos számítás – decimal modul” alfejezete foglalkozik. A véletlenszámgenerálásról és az alkalmazható egyes eloszlásokról pedig a „A véletlen használatba vétele” alfejezetben olvashatunk részletesen.

É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.