Príručka k presnosti a toleranciám v Beancounte
Správa číselnej presnosti je základným kameňom podvojného účtovníctva. V digitálnom účtovníctve, najmä pri práci s viacerými menami, cenami akcií a zlomkovými akciami, môžu malé rozdiely pri zaokrúhľovaní rýchlo viesť k frustrujúcim chybám pri vyrovnávaní. Beancount poskytuje sofistikovaný, ale intuitívny systém na spracovanie presnosti a nastavenie prijateľných tolerancií. Táto príručka vás prevedie tým, ako to funguje. ⚙️
Základné koncepty presnosti
Hlavným cieľom Beancountu je zabezpečiť, aby sa každá transakcia vyrovnala na nulu. Výpočty zahŕňajúce ceny alebo náklady však často produkujú výsledky s väčším počtom desatinných miest, ako je praktické zaznamenávať. Tolerančný systém umožňuje malé, prijateľné nerovnováhy.
Automatické odvodenie tolerancie
Beancount štandardne automaticky odvodzuje požadovanú toleranciu pre každú transakciu. Toto odvodenie sa spracováva individuálne pre každú transakciu a vypočítava sa samostatne pre každú zahrnutú menu.
Pravidlo je jednoduché: tolerancia je polovica poslednej významnej číslice čísel prítomných v účtovných zápisoch transakcie.
Napríklad zvážte tento nákup:
2013-04-03 * "Kúpiť fond"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD
Beancount odvodzuje tolerancie nasledovne:
- Pre komoditu
FUNDmá číslo10.226265 desatinných miest. Tolerancia je polovica poslednej číslice, takžeFUND. - Pre komoditu
USDmá číslo-384.612 desatinné miesta. Tolerancia je polovica poslednej číslice, takžeUSD.
Pravidlá váhy transakcie
Pri kontrole, či je transakcia vyrovnaná, Beancount vypočíta „váhu“ každého účtovného zápisu. Pravidlá pre tento výpočet sú:
- Jednoduchá suma: Ak má účtovný zápis iba sumu (napr.
Assets:Cash -100.00 USD), jeho váha je táto presná suma. - Cenový zápis: Ak má účtovný zápis cenu za jednotku (napr.
10 FUND @ 38.46 USD), jeho váha jesuma × cena. - Nákladový zápis: Ak má účtovný zápis celkové náklady (napr.
10 FUND {384.61 USD}), jeho váha je suma celkových nákladov. - Náklady a cena: Ak má účtovný zápis celkové náklady aj cenu za jednotku (napr.
10 FUND {384.61 USD} @ 38.46 USD), na vyrovnávanie sa použijú iba celkové náklady. Cena za jednotku sa považuje za komentár alebo poznámku.
Pravidlá odvodenia presnosti
Systém automatického odvodenia sa riadi niekoľkými špecifickými pravidlami:
- Formát čísla
- Celé sumy (napr.
10 USD) neprispievajú k odvodeniu 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 odvodenia tolerancie. Používajú sa iba primárne sumy účtovných zápisov. - Ak majú účtovné zápisy pre tú istú menu rôzne presnosti (napr.
-10.10 USDa5.123 USD), Beancount použije najhrubšiu (najväčšiu) toleranciu. V tomto prípade by to bolo založené na-10.10 USD, čo by dalo toleranciuUSD.
-
Predvolené spracovanie Môžete nastaviť globálnu alebo menovo špecifickú predvolenú toleranciu, ak transakcia nemá žiadne čí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. To je užitočné na uvoľnenie kontrol v celom súbore bez zmeny každej transakcie. Multiplikátor
1.2zvýši všetky odvodené tolerancie o 20 %.option "inferred_tolerance_multiplier" "1.2" -
Odvodenie na základe nákladov Aj keď sa náklady zvyčajne ignorujú pri odvodení tolerancie, môžete Beancountu prikázať, aby ich použil. To je užitočné, keď je konečná suma (napr. výber hotovosti) najpresnejším číslom v transakcii.
option "infer_tolerance_from_cost" "TRUE"
Potvrdenia zostatku
Potvrdenia zostatku (balance) sa používajú na overenie, či sa zostatok vášho účtu zhoduje so známou hodnotou k určitému dátumu. Majú tiež priradenú toleranciu.
Základný formát
Podobne ako pri transakciách, tolerancia pre potvrdenie balance sa odvodzuje z počtu desatinných miest v sume.
; Potvrdzuje, že zostatok je 4.271 RGAGX s toleranciou ±0.0005
2015-05-08 balance Assets:Fund 4.271 RGAGX
; Potvrdzuje, že zostatok je 4.27 RGAGX s toleranciou ±0.005
2015-05-08 balance Assets:Fund 4.27 RGAGX
Vypočítaný zostatok musí spadať do tohto rozsahu. Pre druhý príklad by kontrolou prešiel akýkoľvek zostatok medzi a .
Explicitné tolerancie
Ak odvodená tolerancia nie je vhodná, môžete ju explicitne zadať pomocou znaku tilda (~).
; Potvrdzuje, že zostatok je 4.271 RGAGX s vlastnou toleranciou ±0.01 RGAGX
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX
Tu potvrdenie prejde, ak je vypočítaný zostatok medzi a RGAGX.
Správa zaokrúhľovania
Pre prípady, keď sa očakávajú a sú prijateľné malé zvyšky z výpočtov, Beancount poskytuje nástroje na ich systematickú správu.
Sledovanie chýb zaokrúhľovania
Môžete určiť špeciálny účet na automatické zhromažďovanie chýb zaokrúhľovania. Tým sa zabezpečí dokonalé vyrovnanie vašich transakcií presunutím drobný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:RoundingError
Teraz Beancount automaticky pridá tretiu časť k akejkoľvek transakcii, ktorá sa nevyrovná v rámci svojej tolerancie, a zaúčtuje rozdiel do Equity:RoundingError.
2013-02-23 * "Nákup"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
V tejto transakcii . Transakcia je nevyvážená o USD. Keď je povolená možnosť zaokrúhľovania, Beancount ju interne považuje za:
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á číselná presnosť
Beancount môže tiež použiť nastavenia tolerancie na automatické zaokrúhlenie čísel ešte pred ich vložením do dátových štruktúr knihy.
-
Nie je zadaná tolerancia: Ak nie je definovaná žiadna tolerancia, čísla sa používajú s ich úplnou presnosťou. Nedochádza k žiadnemu zaokrúhľovaniu.
-
S predvolenou toleranciou: Ak nastavíte predvolenú toleranciu, čísla sa kvantifikujú na túto úroveň.
option "default_tolerance" "USD:0.001"Pri tomto nastavení by sa číslo ako
53.82135 USDzaokrúhlilo a uložilo ako53.821 USD. -
S účtom zaokrúhľovania: Ak sú aktívne predvolená tolerancia aj účet zaokrúhľovania, Beancount kvantifikuje čí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 doEquity:RoundingError.
Podrobnosti implementácie
Niekoľko technických bodov objasňuje, ako Beancount dosahuje túto spoľahlivosť.
-
Reprezentácia čísel: Beancount používa modul
decimaljazyka Python, nie čísla s pohyblivou desatinnou čiarkou. To umožňuje až 28 desatinných miest presnosti a vyhýba sa chybám binárnej reprezentácie bežným pre čísla s pohyblivou desatinnou čiarkou. -
Trieda DisplayContext: Táto interná trieda spracováva všetky formátovania čísel na účely zobrazenia. Rešpektuje nastavenia presnosti špecifické pre menu 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 zobrazuje).
- Tolerancia je prípustná nerovnováha použitá počas overovacích kontrol.
Osvedčené postupy ✨
Tu je niekoľko praktických odporúčaní na správu presnosti vo vašej účtovnej knihe.
Počiatočné nastavenie
Pre väčšinu nových účtovných kníh je toto robustná úvodná konfigurácia:
; Rozumná 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 prachu zo zaokrúhľovania
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError
Tipy na riešenie problémov
Ak sa vyskytnú chyby pri vyrovnávaní:
- Pridajte desatinné číslice do sumy účtovného zápisu, aby ste vytvorili prísnejšie a presnejšie lokálne odvodenie tolerancie.
- Použite explicitné tolerancie (
~) na potvrdeniachbalance, ktoré zlyhávajú v dôsledku predvídateľných nezrovnalostí. - Sledujte chyby zaokrúhľovania v vyhradenom účte, aby ste videli, kde a ako často sa vyskytujú.
- Zvážte nastavenie predvolených hodnôt špecifických pre menu, ak často pracujete s menami, ktoré majú rôzne konvencie (napr. JPY nemá desatinné miesta).
Stratégia migrácie
Pri aplikácii týchto konceptov na existujúcu, neusporiadanú účtovnú knihu:
- Začnite s veľkorysou globálnou toleranciou (napr.
*:0.05) a vysokým multiplikátorom, aby sa súbor overil. - Postupne sprísňujte tolerancie a opravujte chyby, ktoré sa objavia.
- Pridajte explicitné číslice k sumám v problematických transakciách, aby odvodenie mohlo fungovať.
- Monitorujte zostatok účtu zaokrúhľovania. Veľký alebo rýchlo rastúci zostatok môže signalizovať systémový problém, ktorý si vyžaduje vyšetrenie.