Bancare de rotunjire se transformă, există

Câteva luni în urmă, a fost necesar să se scrie în PHP un mic script care a trebuit să conta un număr mare de date financiare - pentru a lua pe banca transferă cantitatea de interes și se calculează suma. Atunci când se calculează valoarea dobânzii a apărut cu zece și sute de mii de valori acțiuni care sunt la însumarea ulterioare și frământarea a dat unele efecte foarte interesante. De exemplu, script-ul va genera un raport că valoarea inițială și calculată diferă de 10-20 de copeici. Am început să se ocupe de acest lucru, și a descoperit un nou tip de okrulegiya - rotunjiri bancher lui.

Bancare de rotunjire se transformă, există

Mai întâi am mers pe un drum greșit - a început să conducă dobânda calculată prin runda caracteristică. Dar nu a ajutat. Ei erau încă diferențe cu privire la un ban. A trebuit să se așeze și să citească teoria, și în doar 10 minute, a devenit clar că pentru a face față unor astfel de efecte ale metodei de „contabilitate rotunjire“, sau în străinătate - «bancă rotunjire».

Metoda este simplă - în cazul în care rubla miimi egal cu 5, cifra arată în fața ei (câțiva cenți). Dacă este chiar, atunci mii sunt pur și simplu aruncate, iar în cazul în care ciudat - penny rotunjit. Aceasta este, în comparație cu diferențele de rotunjire matematică astfel (aceasta este o matrice de testare de numere mâini numărate).

4.565335, // banca: 4,56, matematica: 4,57
34.565783, // banca: 34.56, matematica: 34.57
56.355532, // banca: 56.36, matematica: 56,36
9.4557642, // banca: 9,45, matematica: 9,45
10.345643, // banca: 10.34, matematica: 10.35
7.235345, // banca: 7.24, matematica: 7,24
9.285456, // banca: 9,28, matematica: 9,29
3.225, // banca: 3,22, matematica: 3.23
10.25527, // banca: 10.26, matematica: 10.26
11.41525, // banca: 11.42, matematica: 11,42
0.105, // banca: 0.10, matematica: 0,11
0.115, // banca: 0,12, matematica 0,12

De fapt, această abordare nu elimină problema complet de rotunjire, dar reduce numai semnificativ probabilitatea acumulării de erori, datorită faptului că numărul de „chiar“ și statistic aproximativ aceleași sume „ciudate“. Dar, în practică, această precizie este suficientă. După utilizarea acestei funcții, cel puțin diferențele vizibile în script-ul sa oprit.

Rămâne doar pentru a găsi o punere în aplicare a acestei funcții pe Internet, și se face. Desigur, un algoritm simplu, dar este întotdeauna mai bine să se bazeze pe experiența de succes altcuiva. Și aici mă așteptare pentru mine mega Nasol. Nu am găsit punerea în aplicare a acestei funcții pentru PHP! Mai degrabă, el a găsit unul pe StackOverflow, dar ea a fost de lucru prin conversia unui șir de caractere și funcția de alocare a substr zecime din valoarea acțiunilor. Pentru druih limbi sunt vândute prin logaritmi.

Nu sunt mulțumit, așa că am scris un minut funcția sa. Explică-are nici un sens, este „transparent“.

Funcția bank_round ($ val)
$ Tmp = intval (abs ($ val) * 100);
if (! $ tmp% 2 = 0) $ tmp + = 1;
în cazul în care ($ val <0) $tmp = 0 — $tmp;
întoarcere $ tmp / 100;
>

Rezultatul executării sale:

Bancare de rotunjire se transformă, există

Un pic explica acest rezultat.

  • Prima coloană - aceasta este de date brute, cu un număr mare de cifre după virgulă. Primul rând „total“ (prin „------“) a înregistrat suma lor aritmetică, iar a doua linie de mai jos: - rezultatul matematic rotunjirii.
  • A doua coloană este cantitatea de numere, fiecare dintre acestea a fost rotunjit în conformitate cu regulile matematice. După cum se poate observa, această abordare dă diferența de 0,4.
  • În cele din urmă, a treia coloană - suma numerelor, fiecare dintre acestea a fost rotunjit de regulile „bancherului rotunjirea“. Rezultatul, așa cum se spune, este evident.

În general - o funcție primitivă, dar dintr-o dată cineva experiență utilă?