Ръководство за Прецизност и Толеранси в Beancount
Управлението на числената прецизност е крайъгълен камък на счетоводството с двойно записване. В дигиталното счетоводство, особено когато се работи с множество валути, цени на акции и дробни акции, малки разлики при закръглянето могат бързо да доведат до фрустриращи грешки при балансирането. Beancount предоставя сложна, но интуитивна система за работа с прецизност и задаване на приемливи толеранси. Това ръководство ще ви преведе през начина, по който тя работи. ⚙️
Основни Концепции за Прецизност
Основната цел на Beancount е да гарантира, че всяка транзакция се балансира до нула. Въпреки това, изчисленията, включващи цени или разходи, често дават резултати с повече десетични знаци, отколкото е практично да се записват. Системата за толеранс позволява малки, приемливи небаланси.
Автоматично Извличане на Толеранс
По подразбиране, Beancount автоматично извлича необходимия толеранс за всяка транзакция. Това извличане се обработва индивидуално за всяка транзакция и се изчислява отделно за всяка валута.
Правилото е просто: толерансът е половината от последната значеща цифра на числата, присъстващи в записите на транзакцията.
Например, разгледайте тази покупка:
2013-04-03 * "Buy Fund"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD
Beancount извлича толерансите, както следва:
- За стоката
FUND, числото10.22626има 5 десетични знака. Толерансът е половината от последната цифра, така чеFUND. - За стоката
USD, числото-384.61има 2 десетични знака. Толерансът е половината от последната цифра, така чеUSD.
Правила за Тегло на Транзакцията
Когато проверява дали дадена транзакция е балансирана, Beancount изчислява "теглото" на всеки запис. Правилата за това изчисление са:
- Проста Сума: Ако даден запис има само сума (например,
Assets:Cash -100.00 USD), неговото тегло е тази точна сума. - Запис с Цена: Ако даден запис има цена за единица (например,
10 FUND @ 38.46 USD), неговото тегло есума × цена. - Запис с Разход: Ако даден запис има обща цена (например,
10 FUND {384.61 USD}), неговото тегло е общата сума на разходите. - Разход и Цена: Ако даден запис има както обща цена, така и цена за единица (например,
10 FUND {384.61 USD} @ 38.46 USD), само общата цена се използва за балансиране. Цената за единица се третира като коментар или бележка.
Правила за Извличане на Прецизност
Автоматичната система за извличане следва няколко конкретни правила:
- Формат на Числото
- Целите суми (например,
10 USD) не допринасят за извличане на прецизност. - Максималният толеранс, който може да бъде автоматично извлечен, е
0.05единици (например, от число като10.1 USD). Ако имате нужда от по-голям толеранс, трябва да го посочите ръчно. - Разходите и цените (например,
{37.61 USD}) са изключени от извличане на толеранс. Използват се само основните суми на записите. - Ако записите за една и съща валута имат различна прецизност (например,
-10.10 USDи5.123 USD), Beancount използва най-грубия (най-големия) толеранс. В този случай, той ще бъде базиран на-10.10 USD, давайки толеранс отUSD.
-
Обработка по подразбиране Можете да зададете глобален или валутно-специфичен толеранс по подразбиране, ако дадена транзакция няма числа с десетични знаци, от които да го извлечет е.
; Задава толеранс по подразбиране за всички валути без изрични правила
option "inferred_tolerance_default" "*:0.001"
; Задава специфичен толеранс по подразбиране за USD
option "inferred_tolerance_default" "USD:0.003" -
Множител на Толеранса Можете глобално да увеличите всички извлечени толеранси с фиксиран множител. Това е полезно за облекчаване на проверките в целия ви файл, без да променяте всяка транзакция. Множител от
1.2увеличава всички извлечени толеранси с 20%.option "inferred_tolerance_multiplier" "1.2" -
Извличане на базата на Разходите Въпреки че разходите обикновено се игнорират за извличане на толеранс, можете да инструктирате Beancount да ги използва. Това е полезно, когато крайната сума (например, теглене на пари в брой) е най-точното число в транзакцията.
option "infer_tolerance_from_cost" "TRUE"
Потвърждения за Баланс
Потвържденията за баланс (balance) се използват за проверка дали балансът на вашия акаунт съвпада с известна стойност на определена дата. Те също имат свързан толеранс.
Основен Формат
Подобно на транзакциите, толерансът за потвърждение balance се извлича от броя на десетичните знаци в сумата.
; Потвърждава, че балансът е 4.271 RGAGX с толеранс от ±0.0005
2015-05-08 balance Assets:Fund 4.271 RGAGX
; Потвърждава, че балансът е 4.27 RGAGX с толеранс от ±0.005
2015-05-08 balance Assets:Fund 4.27 RGAGX
Изчисленият баланс трябва да попадне в този диапазон. За втория пример, всеки баланс между и ще премине проверката.
Изрични Толеранси
Ако извлеченият толеранс не е подходящ, можете да посочите такъв изрично, използвайки символа тилда (~).
; Потвърждава, че балансът е 4.271 RGAGX с потребителски толеранс от ±0.01 RGAGX
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX
Тук потвърждението ще премине, ако изчисленият баланс е между и RGAGX.
Управление на Закръглянето
За случаите, когато се очакват и са приемливи малки остатъци от изчисления, Beancount предоставя инструменти за тяхното систематично управление.
Проследяване на Грешки при Закръгляне
Можете да посочите специален акаунт за автоматично събиране на грешки при закръгляне. Това поддържа вашите транзакции перфектно балансирани, като събирате малки остатъчни суми на едно място.
Първо, активирайте опцията и отворете акаунта:
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError
Сега, Beancount автоматично ще добави трети крак към всяка транзакция, която не се балансира в рамките на толеранса, осчетоводявайки разликата към Equity:RoundingError.
2013-02-23 * "Purchase"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
В тази транзакция, . Транзакцията е небалансирана с USD. С активирана опция за закръгляне, Beancount вътрешно я третира като:
2013-02-23 * "Purchase"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
Equity:RoundingError -0.00135 USD ; Автоматично добавен
Извлечена Прецизност на Числото
Beancount може също да използва настройките за толеранс, за да закръгли автоматично числата, преди дори да бъдат вмъкнати в структурите от данни на книгата.
-
Не е Посочен Толеранс: Ако не е дефиниран толеранс, числата се използват с тяхната пълна прецизност. Не се извършва закръгляне.
-
С Толеранс по Подразбиране: Ако зададете толеранс по подразбиране, числата ще бъдат квантувани до това ниво.
option "default_tolerance" "USD:0.001"С тази настройка, число като
53.82135 USDще бъде закръглено и съ хранено като53.821 USD. -
С Акаунт за Закръгляне: Ако са активни както толеранс по подразбиране, така и акаунт за закръгляне, Beancount квантува числото и улавя остатъка.
option "default_tolerance" "USD:0.01"
option "account_rounding" "Equity:RoundingError"Число като
53.82135 USDще бъде съхранено като53.82 USD, а остатъкът от-0.00135 USDще бъде осчетоводен къмEquity:RoundingError.