La gestione della precisione numerica è un pilastro della contabilità a partita doppia. Nella contabilità digitale, specialmente quando si ha a che fare con valute multiple, prezzi di azioni e frazioni di azioni, piccole discrepanze di arrotondamento possono rapidamente portare a frustranti errori di bilanciamento. Beancount fornisce un sistema sofisticato ma intuitivo per gestire la precisione e impostare tolleranze accettabili. Questa guida ti spiegherà come funziona. ⚙️
Concetti Fondamentali di Precisione
L'obiettivo principale di Beancount è garantire che ogni transazione sia bilanciata a zero. Tuttavia, calcoli che coinvolgono prezzi o costi spesso producono risultati con più decimali di quanti sia pratico registrare. Il sistema di tolleranza permette piccoli sbilanciamenti accettabili.
Inferenza Automatica della Tolleranza
Per impostazione predefinita, Beancount inferisce automaticamente la tolleranza necessaria per ogni transazione. Questa inferenza è gestita individualmente per ogni transazione e calcolata separatamente per ogni valuta coinvolta.
La regola è semplice: la tolleranza è la metà dell'ultima cifra significativa dei numeri presenti nelle scritture contabili della transazione.
Ad esempio, considera questo acquisto:
2013-04-03 * "Acquisto Fondo"
Assets:Fondo 10.22626 FONDO {37.61 USD}
Assets:Contante -384.61 USDBeancount inferisce le tolleranze come segue:
- Per la merce
FONDO, il numero10.22626ha 5 decimali. La tolleranza è la metà dell'ultima cifra, quindi $0.00001 \div 2 = 0.000005$FONDO. - Per la merce
USD, il numero-384.61ha 2 decimali. La tolleranza è la metà dell'ultima cifra, quindi $0.01 \div 2 = 0.005$USD.
Regole del Peso della Transazione
Quando verifica se una transazione è bilanciata, Beancount calcola il "peso" di ogni scrittura contabile. Le regole per questo calcolo sono:
- Importo Semplice: Se una scrittura ha solo un importo (es.,
Assets:Contante -100.00 USD), il suo peso è quell'importo esatto. - Scrittura con Prezzo: Se una scrittura ha un prezzo unitario (es.,
10 FONDO @ 38.46 USD), il suo peso èimporto × prezzo. - Scrittura con Costo: Se una scrittura ha un costo totale (es.,
10 FONDO {384.61 USD}), il suo peso è l'importo del costo totale. - Costo e Prezzo: Se una scrittura ha sia un costo totale che un prezzo unitario (es.,
10 FONDO {384.61 USD} @ 38.46 USD), solo il costo totale viene utilizzato per il bilanciamento. Il prezzo unitario viene trattato come un commento o un promemoria.
Regole di Inferenza della Precisione
Il sistema di inferenza automatica segue alcune regole specifiche:
- Formato del Numero
- Gli importi interi (es.,
10 USD) non contribuiscono all'inferenza della precisione. - La tolleranza massima che può essere inferita automaticamente è
0.05unità (es., da un numero come10.1 USD). Se hai bisogno di una tolleranza maggiore, devi specificarla manualmente. - Costi e prezzi (es.,
{37.61 USD}) sono esclusi dall'inferenza della tolleranza. Vengono utilizzati solo gli importi principali delle scritture contabili. - Se le scritture per la stessa valuta hanno precisioni diverse (es.,
-10.10 USDe5.123 USD), Beancount utilizza la tolleranza più grossolana (maggiore). In questo caso, sarebbe basata su-10.10 USD, producendo una tolleranza di $0.005$USD.
-
Gestione Predefinita Puoi impostare una tolleranza predefinita globale o specifica per valuta se una transazione non ha numeri con decimali da cui inferirla.
; Imposta una tolleranza predefinita per tutte le valute senza regole esplicite option "inferred_tolerance_default" "*:0.001" ; Imposta una tolleranza predefinita specifica per USD option "inferred_tolerance_default" "USD:0.003" -
Moltiplicatore di Tolleranza Puoi aumentare globalmente tutte le tolleranze inferite di un moltiplicatore fisso. Questo è utile per allentare i controlli in tutto il file senza modificare ogni transazione. Un moltiplicatore di
1.2aumenta tutte le tolleranze inferite del 20%.option "inferred_tolerance_multiplier" "1.2" -
Inferenza Basata sul Costo Sebbene i costi siano normalmente ignorati per l'inferenza della tolleranza, puoi istruire Beancount ad usarli. Questo è utile quando l'importo finale (es., un prelievo di contante) è il numero più preciso in una transazione.
option "infer_tolerance_from_cost" "TRUE"
Affermazioni di Bilancio
Le affermazioni di bilancio (balance) vengono utilizzate per verificare che il saldo del tuo conto corrisponda a un valore noto in una data specifica. Anch'esse hanno una tolleranza associata.
Formato Base
Similmente alle transazioni, la tolleranza per un'affermazione balance viene inferita dal numero di decimali nell'importo.
; Afferma che il saldo è 4.271 RGAGX con una tolleranza di ±0.0005
2015-05-08 balance Assets:Fondo 4.271 RGAGX
; Afferma che il saldo è 4.27 RGAGX con una tolleranza di ±0.005
2015-05-08 balance Assets:Fondo 4.27 RGAGXIl saldo calcolato deve rientrare in questo intervallo. Per il secondo esempio, qualsiasi saldo tra e supererebbe il controllo.
Tolleranze Esplicite
Se la tolleranza inferita non è adatta, puoi specificarne una esplicitamente usando il carattere tilde (~).
; Afferma che il saldo è 4.271 RGAGX con una tolleranza personalizzata di ±0.01 RGAGX
2015-05-08 balance Assets:Fondo 4.271 ~ 0.01 RGAGXQui, l'affermazione avrà successo se il saldo calcolato è compreso tra e RGAGX.
Gestione dell'Arrotondamento
Per i casi in cui piccoli residui dai calcoli sono previsti e accettabili, Beancount fornisce strumenti per gestirli sistematicamente.
Tracciamento degli Errori di Arrotondamento
Puoi designare un conto speciale per raccogliere automaticamente gli errori di arrotondamento. Ciò mantiene le tue transazioni perfettamente bilanciate spazzando piccole quantità residue in un unico posto.
Per prima cosa, abilita l'opzione e apri il conto:
option "account_rounding" "PatrimonioNetto:ErroreArrotondamento"
2000-01-01 open PatrimonioNetto:ErroreArrotondamentoOra, Beancount aggiungerà automaticamente una terza gamba a qualsiasi transazione che non sia bilanciata entro la sua tolleranza, registrando la differenza in PatrimonioNetto:ErroreArrotondamento.
2013-02-23 * "Acquisto"
Assets:Investimento 1.245 RGAGX {43.23 USD}
Assets:Contante -53.82 USDIn questa transazione, . La transazione è sbilanciata di USD. Con l'opzione di arrotondamento abilitata, Beancount la tratta internamente come:
2013-02-23 * "Acquisto"
Assets:Investimento 1.245 RGAGX {43.23 USD}
Assets:Contante -53.82 USD
PatrimonioNetto:ErroreArrotondamento -0.00135 USD ; Aggiunto automaticamentePrecisione Numerica Inferita
Beancount può anche utilizzare le impostazioni di tolleranza per arrotondare automaticamente i numeri prima ancora che vengano inseriti nelle strutture dati del libro.
-
Nessuna Tolleranza Specificata: Se non viene definita alcuna tolleranza, i numeri vengono utilizzati con la loro precisione massima. Non avviene alcun arrotondamento.
-
Con Tolleranza Predefinita: Se imposti una tolleranza predefinita, i numeri vengono quantizzati a quel livello.
option "default_tolerance" "USD:0.001"Con questa impostazione, un numero come
53.82135 USDverrebbe arrotondato e memorizzato come53.821 USD. -
Con Conto di Arrotondamento: Se sia una tolleranza predefinita che un conto di arrotondamento sono attivi, Beancount quantizza il numero e cattura il residuo.
option "default_tolerance" "USD:0.01" option "account_rounding" "PatrimonioNetto:ErroreArrotondamento"Un numero come
53.82135 USDverrebbe memorizzato come53.82 USD, e il residuo di-0.00135 USDverrebbe registrato inPatrimonioNetto:ErroreArrotondamento.
Dettagli Implementativi
Alcuni punti tecnici chiariscono come Beancount raggiunga questa affidabilità.
-
Rappresentazione dei Numeri: Beancount utilizza il modulo
decimaldi Python, non i numeri a virgola mobile. Ciò consente fino a 28 decimali di precisione e evita gli errori di rappresentazione binaria comuni ai float. -
Classe DisplayContext: Questa classe interna gestisce tutta la formattazione dei numeri per scopi di visualizzazione. Rispetta le impostazioni di precisione specifiche per valuta e può formattare l'output con colonne allineate e virgole.
-
Precisione vs. Tolleranza: È fondamentale distinguere questi due concetti:
- Precisione riguarda il formato di visualizzazione di un numero (quanti decimali vengono mostrati).
- Tolleranza è la tolleranza per lo sbilanciamento utilizzata durante i controlli di verifica.
Migliori Pratiche ✨
Ecco alcuni consigli pratici per gestire la precisione nel tuo registro.
Configurazione Iniziale
Per la maggior parte dei nuovi registri, questa è una configurazione iniziale robusta:
; Una tolleranza predefinita ragionevole per la maggior parte delle valute (es., USD, EUR)
option "inferred_tolerance_default" "*:0.005"
; Un buffer del 10% su tutte le tolleranze inferite
option "inferred_tolerance_multiplier" "1.1"
; Un conto per catturare tutta la polvere di arrotondamento
option "account_rounding" "PatrimonioNetto:ErroreArrotondamento"
2000-01-01 open PatrimonioNetto:ErroreArrotondamentoSuggerimenti per la Risoluzione dei Problemi
Se incontri errori di bilanciamento:
- Aggiungi cifre decimali all'importo di una scrittura contabile per creare un'inferenza di tolleranza locale più stretta e accurata.
- Utilizza tolleranze esplicite (
~) sulle affermazionibalanceche falliscono a causa di discrepanze prevedibili. - Tieni traccia degli errori di arrotondamento in un conto dedicato per vedere dove e con quale frequenza si verificano.
- Considera l'impostazione di predefiniti specifici per valuta se hai spesso a che fare con valute che hanno convenzioni diverse (es., JPY non ha decimali).
Strategia di Migrazione
Quando applichi questi concetti a un registro esistente e disordinato:
- Inizia con una tolleranza globale generosa (es.,
*:0.05) e un moltiplicatore alto per far sì che il file venga convalidato. - Progressivamente restringi le tolleranze e correggi gli errori che emergono.
- Aggiungi cifre esplicite agli importi nelle transazioni problematiche per consentire all'inferenza di fare il suo lavoro.
- Monitora il saldo del conto di arrotondamento. Un saldo grande o in rapida crescita potrebbe segnalare un problema sistemico che necessita di indagine.