Riadenie numerickej presnosti je základom podvojného účtovníctva. V digitálnom účtovníctve, najmä pri práci s viacerými menami, cenami akcií a zlomkovými podielmi, môžu malé rozdiely v zaokrúhľovaní rýchlo viesť k frustrujúcim chybám pri párovaní. Beancount poskytuje sofistikovaný, ale intuitívny systém pre riadenie presnosti a nastavovanie prijateľných tolerancií. Táto príručka vás prevedie tým, ako funguje. ⚙️
Základné koncepty presnosti
Hlavným cieľom Beancount je zabezpečiť, aby každá transakcia bola vyrovnaná na nulu. Avšak výpočty zahŕňajúce ceny alebo náklady často produkujú výsledky s viac desatinnými miestami, než je praktické zaznamenať. Systém tolerancií umožňuje malé, prijateľné nevyváženosti.
Automatické odvodzovanie tolerancií
V predvolenom nastavení Beancount automaticky odvodzuje požadovanú toleranciu pre každú transakciu. Toto odvodzovanie sa spracúva individuálne pre každú transakciu a počíta sa samostatne pre každú zúčastnenú menu.
Pravidlo je jednoduché: tolerancia je polovica poslednej platnej číslice čísel prítomných v položkách transakcie.
Zvážte napríklad tento nákup:
2013-04-03 * "Nákup fondu"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USDBeancount odvodí tolerancie nasledovne:
- Pre komoditu
FUND, číslo10.22626má 5 desatinných miest. Tolerancia je polovica poslednej číslice, takže $0.00001 \div 2 = 0.000005$FUND. - Pre komoditu
USD, číslo-384.61má 2 desatinné miesta. Tolerancia je polovica poslednej číslice, takže $0.01 \div 2 = 0.005$USD.
Pravidlá pre váhu transakcie
Pri kontrole, či je transakcia vyrovnaná, Beancount vypočíta "váhu" každej položky. Pravidlá pre tento výpočet sú:
- Jednoduchá suma: Ak má položka iba sumu (napr.
Assets:Cash -100.00 USD), jej váhou je presne táto suma. - Položka s cenou: Ak má položka cenu za jednotku (napr.
10 FUND @ 38.46 USD), jej váhou jesuma × cena. - Položka s nákladom: Ak má položka celkový náklad (napr.
10 FUND {384.61 USD}), jej váhou je celková suma nákladu. - Náklad a cena: Ak má položka celkový náklad aj cenu za jednotku (napr.
10 FUND {384.61 USD} @ 38.46 USD), na vyrovnanie sa používa iba celkový náklad. Cena za jednotku sa považuje za komentár alebo poznámku.
Pravidlá odvodzovania presnosti
Automatický systém odvodzovania sa riadi niekoľkými špecifickými pravidlami:
- Formát čísla
- Celočíselné sumy (napr.
10 USD) neprispievajú k odvodzovaniu presnosti. - Maximálna tolerancia, ktorú je možné automaticky odvodiť, je
0.05jednotiek (napr. z čísla ako10.1 USD). Ak potrebujete väčšiu toleranciu, musíte ju zadať manuálne. - Náklady a ceny (napr.
{37.61 USD}) sú vylúčené z odvodzovania tolerancie. Používajú sa iba primárne sumy položiek. - Ak majú položky pre rovnakú menu rôznu presnosť (napr.
-10.10 USDa5.123 USD), Beancount použije najhrubšiu (najväčšiu) toleranciu. V tomto prípade by bola založená na-10.10 USD, čo by poskytlo toleranciu $0.005$USD.
-
Predvolené spracovanie Môžete nastaviť globálnu predvolenú toleranciu alebo predvolenú toleranciu pre konkrétnu menu, ak transakcia neobsahuje čísla s desatinnými miestami, z ktorých by sa dala odvodiť.
; Nastaví predvolenú toleranciu pre všetky meny bez explicitných pravidiel option "inferred_tolerance_default" "*:0.001" ; Nastaví špecifickú predvolenú toleranciu pre USD option "inferred_tolerance_default" "USD:0.003" -
Multiplikátor tolerancie Môžete globálne zvýšiť všetky odvodené tolerancie o pevný multiplikátor. Je to užitočné na uvoľnenie kontrol v celom súbore bez zmeny každej transakcie. Multiplikátor
1.2zvyšuje všetky odvodené tolerancie o 20%.option "inferred_tolerance_multiplier" "1.2" -
Odvodzovanie založené na nákladoch Zatiaľ čo náklady sú pri odvodzovaní tolerancie normálne ignorované, môžete Beancount inštruovať, aby ich používal. Je to užitočné, keď je konečná suma (napr. výber hotovosti) najpresnejším číslom v transakcii.
option "infer_tolerance_from_cost" "TRUE"
Zostatkové tvrdenia
Zostatkové tvrdenia (balance) sa používajú na overenie, že zostatok vášho účtu zodpovedá známej hodnote k určitému dátumu. Majú tiež priradenú toleranciu.
Základný formát
Podobne ako pri transakciách, tolerancia pre zostatkové tvrdenie sa odvodzuje z počtu desatinných miest v sume.
; Tvrdí, že zostatok je 4.271 RGAGX s toleranciou ±0.0005
2015-05-08 balance Assets:Fund 4.271 RGAGX
; Tvrdí, že zostatok je 4.27 RGAGX s toleranciou ±0.005
2015-05-08 balance Assets:Fund 4.27 RGAGXVypočítaný zostatok musí spadať do tohto rozsahu. V druhom príklade by akýkoľvek zostatok medzi a prešiel kontrolou.
Explicitné tolerancie
Ak odvodená tolerancia nie je vhodná, môžete ju zadať explicitne pomocou znaku tilda (~).
; Tvrdí, že zostatok je 4.271 RGAGX s vlastnou toleranciou ±0.01 RGAGX
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGXTu tvrdenie prejde, ak je vypočítaný zostatok medzi a RGAGX.
Riadenie zaokrúhľovania
Pre prípady, kde sú malé zvyšky z výpočtov očakávané a prijateľné, Beancount poskytuje nástroje na ich systematické riadenie.
Sledovanie chýb zaokrúhľovania
Môžete určiť špeciálny účet, ktorý bude automaticky zbierať chyby zaokrúhľovania. To udržuje vaše transakcie dokonale vyrovnané presunutím malých zvyšných súm na jedno miesto.
Najprv povoľte možnosť a otvorte účet:
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingErrorTeraz Beancount automaticky pridá tretiu stranu ku každej transakcii, ktorá nie je vyrovnaná v rámci svojej tolerancie, a zaúčtuje rozdiel na Equity:RoundingError.
2013-02-23 * "Nákup"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USDV tejto transakcii je . Transakcia je nevyrovnaná o USD. S povolenou možnosťou zaokrúhľovania ju Beancount interne spracuje ako:
2013-02-23 * "Nákup"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
Equity:RoundingError -0.00135 USD ; Automaticky pridanéOdvodená presnosť čísel
Beancount môže tiež použiť nastavenia tolerancie na automatické zaokrúhľovanie čísel ešte pred ich vložením do dátových štruktúr knihy.
-
Neuvedená tolerancia: Ak nie je definovaná žiadna tolerancia, čísla sa používajú v ich plnej presnosti. Nevykonáva sa žiadne zaokrúhľovanie.
-
S predvolenou toleranciou: Ak nastavíte predvolenú toleranciu, čísla sa kvantujú na túto úroveň.
option "default_tolerance" "USD:0.001"S týmto nastavením by sa číslo ako
53.82135 USDzaokrúhlilo a uložilo ako53.821 USD. -
S účtom na zaokrúhľovanie: Ak je aktívna predvolená tolerancia aj účet na zaokrúhľovanie, Beancount kvantuje číslo a zachytí zvyšok.
option "default_tolerance" "USD:0.01" option "account_rounding" "Equity:RoundingError"Číslo ako
53.82135 USDby sa uložilo ako53.82 USDa zvyšok-0.00135 USDby sa zaúčtoval naEquity:RoundingError.
Podrobnosti implementácie
Niekoľko technických bodov objasňuje, ako Beancount dosahuje túto spoľahlivosť.
-
Reprezentácia čísel: Beancount používa Python modul
decimal, nie čísla s pohyblivou desatinnou čiarkou. To umožňuje presnosť až na 28 desatinných miest a vyhýba sa chybám binárnej reprezentácie bežným pri floatoch. -
Trieda DisplayContext: Táto interná trieda spracúva všetko formátovanie čísel na účely zobrazenia. Rešpektuje nastavenia presnosti pre konkrétne meny a dokáže formátovať výstup so zarovnanými stĺpcami a čiarkami.
-
Presnosť vs. Tolerancia: Je dôležité rozlišovať tieto dva koncepty:
- Presnosť sa týka formátu zobrazenia čísla (koľko desatinných miest sa ukáže).
- Tolerancia je povolená odchýlka od rovnováhy používaná počas overovacích kontrol.
Osvedčené postupy ✨
Tu je niekoľko praktických odporúčaní pre riadenie presnosti vo vašej knihe.
Počiatočné nastavenie
Pre väčšinu nových kníh je toto robustná počiatočná konfigurácia:
; Primeraná predvolená hodnota pre väčšinu mien (napr. USD, EUR)
option "inferred_tolerance_default" "*:0.005"
; 10% rezerva na všetky odvodené tolerancie
option "inferred_tolerance_multiplier" "1.1"
; Účet na zachytenie všetkého zaokrúhľovacieho prachu
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingErrorTipy na riešenie problémov
Ak narazíte na chyby párovania:
- Pridajte desatinné číslice k sume položky, aby ste vytvorili presnejšie miestne odvodenie tolerancie.
- Použite explicitné tolerancie (
~) na zostatkových tvrdeniach, ktoré zlyhávajú kvôli predvídateľným nezrovnalostiam. - Sledujte chyby zaokrúhľovania na vyhradenom účte, aby ste videli, kde a ako často vznikajú.
- Zvážte nastavenie predvolených hodnôt pre konkrétne meny, ak často pracujete s menami, ktoré majú rôzne konvencie (napr. JPY nemá desatinné miesta).
Migračná stratégia
Pri aplikovaní týchto konceptov na existujúcu, neusporiadanú knihu:
- Začnite s veľkorysou globálnou toleranciou (napr.
*:0.05) a vysokým multiplikátorom, aby sa súbor validoval. - Postupne utiahnite tolerancie a opravujte chyby, ktoré sa objavia.
- Pridajte explicitné číslice do súm v problematických transakciách, aby odvodzovanie fungovalo správne.
- Sledujte zostatok účtu na zaokrúhľovanie. Veľký alebo rýchlo rastúci zostatok môže signalizovať systémový problém, ktorý si vyžaduje preskúmanie.