From ee74572dbf48ad511e3367f43bd88bf25c87615b Mon Sep 17 00:00:00 2001 From: Ada Fernsby Date: Mon, 2 Mar 2026 09:31:50 +0000 Subject: [PATCH 2/3] feat(ledger): add banker's rounding helper In-Reply-To: <024f75262757878b20f7a3e64c1472d87a75d6b8.1772442000.git.ada.fernsby@example.invalid> References: <024f75262757878b20f7a3e64c1472d87a75d6b8.1772442000.git.ada.fernsby@example.invalid> Half-up rounding drifts the balance upward over long runs. Signed-off-by: Ada Fernsby --- 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