Руководство по точности и допускам в Beancount
Управление числовой точностью является краеугольным камнем двойной бухгалтерии. В цифровом бухгалтерском учете, особенно при работе с несколькими валютами, ценами акций и дробными акциями, небольшие расхождения округления могут быстро привести к неприятным ошибкам балансировки. Beancount предоставляет сложную, но интуитивно понятную систему для обработки точности и установки приемлемых допусков. Это руководство проведет вас через то, как это работает. ⚙️
Основные понятия точности
Основная цель Beancount — гарантировать, что каждая транзакция сбалансирована до нуля. Однако вычисления, связанные с ценами или затратами, часто дают результаты с большим количеством десятичных знаков, чем практически необходимо записывать. Система допусков допускает небольшие приемлемые дисбалансы.
Автоматический вывод допусков
По умолчанию Beancount автоматически выводит требуемый допуск для каждой транзакции. Этот вывод обрабатывается индивидуально для каждой транзакции и рассчитывается отдельно для каждой задействованной валюты.
Правило простое: допуск составляет половину последнего значащего разряда чисел, представленных в проводках транзакции.
Например, рассмотрим эту покупку:
2013-04-03 * "Купить фонд"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD
Beancount выводит допуски следующим образом:
- Для товара
FUNDчисло10.22626имеет 5 знаков после запятой. Допуск составляет половину последней цифры, то есть $0.00001 \div 2 = 0.000005$FUND. - Для товара
USDчисло-384.61имеет 2 знака после запятой. Допуск составляет половину последней цифры, то есть $0.01 \div 2 = 0.005$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, что дает допуск в размере $0.005$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.