From f27ade02150fbbbfe7f493ad141de516e72cdcab Mon Sep 17 00:00:00 2001 From: Miguel Otero Date: Wed, 4 Mar 2026 11:02:19 +0000 Subject: [PATCH] feat(ledger): add banker's rounding helper Long runs of half-up rounding drift the balance upward by a cent every few thousand postings. --- internal/ledger/rounding.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+), 0 deletions(-) create mode 100644 internal/ledger/rounding.go diff --git a/internal/ledger/rounding.go b/internal/ledger/rounding.go new file mode 100644 index 0000000..d6f0c19 --- /dev/null +++ b/internal/ledger/rounding.go @@ -0,0 +1,17 @@ +package ledger + +// HalfEven rounds a minor-unit amount to the nearest multiple of step using +// banker's rounding, which keeps long runs of postings from drifting upward. +func HalfEven(minor, step int64) int64 { + if step <= 1 { + return minor + } + q, r := minor/step, minor%step + switch { + case 2*r > step: + q++ + case 2*r == step && q%2 != 0: + q++ + } + return q * step +} -- 2.43.0