Преминете към основното съдържание

Ръководство за Прецизност и Толеранси в Beancount

Управлението на числената прецизност е крайъгълен камък на счетоводството с двойно записване. В дигиталното счетоводство, особено когато се работи с множество валути, цени на акции и дробни акции, малки разлики при закръглянето могат бързо да доведат до фрустриращи грешки при балансирането. Beancount предоставя сложна, но интуитивна система за работа с прецизност и задаване на приемливи толеранси. Това ръководство ще ви преведе през начина, по който тя работи. ⚙️

Основни Концепции за Прецизност

precision

Основната цел на 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 десетични знака. Толерансът е половината от последната цифра, така че 0.00001div2=0.0000050.00001 \\div 2 = 0.000005 FUND.
  • За стоката USD, числото -384.61 има 2 десетични знака. Толерансът е половината от последната цифра, така че 0.01div2=0.0050.01 \\div 2 = 0.005 USD.

Правила за Тегло на Транзакцията

Когато проверява дали дадена транзакция е балансирана, Beancount изчислява "теглото" на всеки запис. Правилата за това изчисление са:

  1. Проста Сума: Ако даден запис има само сума (например, Assets:Cash -100.00 USD), неговото тегло е тази точна сума.
  2. Запис с Цена: Ако даден запис има цена за единица (например, 10 FUND @ 38.46 USD), неговото тегло е сума × цена.
  3. Запис с Разход: Ако даден запис има обща цена (например, 10 FUND {384.61 USD}), неговото тегло е общата сума на разходите.
  4. Разход и Цена: Ако даден запис има както обща цена, така и цена за единица (например, 10 FUND {384.61 USD} @ 38.46 USD), само общата цена се използва за балансиране. Цената за единица се третира като коментар или бележка.

Правила за Извличане на Прецизност

Автоматичната система за извличане следва няколко конкретни правила:

  1. Формат на Числото
  • Целите суми (например, 10 USD) не допринасят за извличане на прецизност.
  • Максималният толеранс, който може да бъде автоматично извлечен, е 0.05 единици (например, от число като 10.1 USD). Ако имате нужда от по-голям толеранс, трябва да го посочите ръчно.
  • Разходите и цените (например, {37.61 USD}) са изключени от извличане на толеранс. Използват се само основните суми на записите.
  • Ако записите за една и съща валута имат различна прецизност (например, -10.10 USD и 5.123 USD), Beancount използва най-грубия (най-големия) толеранс. В този случай, той ще бъде базиран на -10.10 USD, давайки толеранс от 0.0050.005 USD.
  1. Обработка по подразбиране Можете да зададете глобален или валутно-специфичен толеранс по подразбиране, ако дадена транзакция няма числа с десетични знаци, от които да го извлечете.

    ; Задава толеранс по подразбиране за всички валути без изрични правила
    option "inferred_tolerance_default" "*:0.001"

    ; Задава специфичен толеранс по подразбиране за USD
    option "inferred_tolerance_default" "USD:0.003"
  2. Множител на Толеранса Можете глобално да увеличите всички извлечени толеранси с фиксиран множител. Това е полезно за облекчаване на проверките в целия ви файл, без да променяте всяка транзакция. Множител от 1.2 увеличава всички извлечени толеранси с 20%.

    option "inferred_tolerance_multiplier" "1.2"
  3. Извличане на базата на Разходите Въпреки че разходите обикновено се игнорират за извличане на толеранс, можете да инструктирате 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.2654.265 и 4.2754.275 ще премине проверката.

Изрични Толеранси

Ако извлеченият толеранс не е подходящ, можете да посочите такъв изрично, използвайки символа тилда (~).

; Потвърждава, че балансът е 4.271 RGAGX с потребителски толеранс от ±0.01 RGAGX
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX

Тук потвърждението ще премине, ако изчисленият баланс е между 4.2614.261 и 4.2814.281 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

В тази транзакция, 1.245times43.23=53.821351.245 \\times 43.23 = 53.82135. Транзакцията е небалансирана с 0.00135-0.00135 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 може също да използва настройките за толеранс, за да закръгли автоматично числата, преди дори да бъдат вмъкнати в структурите от данни на книгата.

  1. Не е Посочен Толеранс: Ако не е дефиниран толеранс, числата се използват с тяхната пълна прецизност. Не се извършва закръгляне.

  2. С Толеранс по Подразбиране: Ако зададете толеранс по подразбиране, числата ще бъдат квантувани до това ниво.

    option "default_tolerance" "USD:0.001"

    С тази настройка, число като 53.82135 USD ще бъде закръглено и съхранено като 53.821 USD.

  3. С Акаунт за Закръгляне: Ако са активни както толеранс по подразбиране, така и акаунт за закръгляне, Beancount квантува числото и улавя остатъка.

    option "default_tolerance" "USD:0.01"
    option "account_rounding" "Equity:RoundingError"

    Число като 53.82135 USD ще бъде съхранено като 53.82 USD, а остатъкът от -0.00135 USD ще бъде осчетоводен към Equity:RoundingError.

Детайли по Имплементацията

Няколко технически точки поясняват как Beancount постига тази надеждност.

  1. Представяне на Числа: Beancount използва Python модула decimal, не floating-point числа. Това позволява до 28 десетични знака прецизност и избягва грешките при двоичното представяне, често срещани при floats.

  2. DisplayContext Клас: Този вътрешен клас обработва цялото форматиране на числата за целите на показване. Той зачита специфичните за валутата настройки за прецизност и може да форматира изхода с подравнени колони и запетаи.

  3. Прецизност vs. Толеранс: От решаващо значение е да се разграничат тези две концепции:

  • Прецизността се отнася до формата на показване на число (колко десетични знака се показват).
  • Толерансът е допустимото отклонение за небаланс, използвано по време на проверките за потвърждение.

Най-добри Практики ✨

Ето някои практически препоръки за управление на прецизността във вашата счетоводна книга.

Първоначална Настройка

За повечето нови счетоводни книги това е стабилна отправна конфигурация:

; Разумна стойност по подразбиране за повечето валути (например, USD, EUR)
option "inferred_tolerance_default" "*:0.005"

; 10% буфер за всички извлечени толеранси
option "inferred_tolerance_multiplier" "1.1"

; Акаунт за улавяне на целия прах от закръглянето
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Съвети за Отстраняване на Проблеми

Ако срещнете грешки при балансиране:

  • Добавете десетични цифри към сумата на запис, за да създадете по-стегнато и точно локално извличане на толеранс.
  • Използвайте изрични толеранси (~) на потвърждения за balance, които не успяват поради предвидими несъответствия.
  • Проследявайте грешките при закръгляне в специален акаунт, за да видите къде и колко често се случват.
  • Обмислете задаването на специфични за валутата стойности по подразбиране, ако често работите с валути, които имат различни конвенции (например, JPY няма десетични знаци).

Стратегия за Миграция

Когато прилагате тези концепции към съществуваща, разхвърляна счетоводна книга:

  1. Започнете с щедър глобален толеранс (например, *:0.05) и висок множител, за да накарате файла да се валидира.
  2. Постепенно затегнете толерансите и поправете грешките, които се появяват.
  3. Добавете изрични цифри към сумите в проблемни транзакции, за да позволите на извличането да си свърши работата.
  4. Наблюдавайте баланса на акаунта за закръгляне. Голям или бързо нарастващ баланс може да сигнализира за системен проблем, който трябва да бъде проучен.