Banki kerekítés fordulat, van

Pár hónappal ezelőtt, szükséges volt, hogy írjon a PHP egy kis script, hogy el kellett számolni számos pénzügyi adatok -, hogy a bank átutalja a kamat összegét, és kiszámítja az összeget. Összegének kiszámítása során az érdeklődés nyilvánult meg a tíz és száz ezer részvények, amelyek értéke a későbbi összegző és a kerekítés adott néhány nagyon érdekes hatásokat. Például, a script generál egy jelentést, hogy az összeg a kezdeti és a kiszámított különböznek 10-20 kopecks. Elkezdtem foglalkozni ezzel, és felfedezett egy új típusú okrulegiya - bankár kerekítés.

Banki kerekítés fordulat, van

Először mentem rossz irányba - kezdte vezetni számított kamat a funkció fordulóban. De ez nem segített. Ők még mindig különbségek egy érmét. Volt, hogy üljön le, és olvassa el az elmélet, és mindössze 10 perc alatt világossá vált, hogy kell kezelni az ilyen hatások a módszer a „számviteli kerekítés”, vagy külföldön - «bank kerekítés».

A módszer egyszerű - ha ezrelék rubel értéke 5, ez a szám úgy néz ki, előtte (néhány cent). Ha páros, akkor több ezer egyszerűen eldobjuk, ha páratlan - penny kerekítve. Azaz, míg a matematikai kerekítési eltéréseket, (ez egy teszt tömb számok számítanak kéz).

4.565335, // bank: 4,56, matematika: 4,57
34.565783, // bank: 34,56, matematika: 34.57
56.355532, // bank: 56.36, matematika: 56,36
9.4557642, // bank: 9,45, matematika: 9,45
10.345643, // bank: 10,34, matematika: 10.35
7.235345, // bank: 7,24, matematika: 7,24
9.285456, // bank: 9,28, matematika: 9,29
3,225, // bank: 3,22, matematika: 3,23
10,25527, // bank: 10,26, matematika: 10.26
11,41525, // bank: 11,42, matematika: 11,42
0,105, // bank: 0,10, matematika: 0,11
0.115, // bank: 0,12, 0,12 matematikai

Tény, hogy ez a megközelítés nem szünteti meg teljesen a problémát, de csak kerekítés jelentősen csökkenti annak valószínűségét, hogy a felhalmozási hibák annak a ténynek köszönhető, hogy a több „még” és „furcsa” statisztikailag nagyjából azonos mennyiségben. A gyakorlatban azonban ez a pontosság elegendő. Használat után ez a funkció, legalábbis a látható különbség a script megállt.

Továbbra is csak találni egy megvalósítása ezt a funkciót az interneten, és kész. Természetesen egy egyszerű algoritmus, de ez mindig jobb támaszkodni valaki másnak a sikeres tapasztalatok. És itt vagyok várt rám mega tivornya. Nem találja a végrehajtását ez a funkció a PHP! Ehelyett talált egy a StackOverflow, de dolgozott a konverzió egy húr és elosztására funkció substr tizedik összeg felett. Mert druih nyelven keresztül adják a logaritmus.

Nem vagyok elégedett, ezért írtam egy percre a funkcióját. Magyarázza, hogy nincs értelme, hogy „átlátható”.

függvény bank_round ($ val)
$ Tmp = intval (abs ($ Val) * 100);
if ($ TMP% 2 = 0!) $ TMP + = 1;
if ($ ertek <0) $tmp = 0 — $tmp;
visszatérés $ tmp / 100;
>

Az eredmény annak végrehajtását:

Banki kerekítés fordulat, van

Egy kis magyarázatot ezt az eredményt.

  • Az első oszlop - ez a nyers adatok nagy utáni számjegyek száma a tizedespont. Az első sorban az „összes” (a „------”) rögzített számtani összege, és a második vonal alatti - az eredmény a matematikai kerekítés.
  • A második oszlop az az összeg, a számok, amelyek mindegyike már kerekítve szerinti matematikai szabályok. Mint látható, ez a megközelítés a különbség 0,4.
  • Végül a harmadik oszlop - a számok összege, amelyek mindegyike zárta a szabályok szerint „bankár kerekítés”. Az eredmény, mint mondják, az nyilvánvaló.

Általában - egy primitív függvény, de hirtelen valaki hasznos tapasztalatot?