fix: make price and per-fill notional conversions exact - #2
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A caller's Decimal precision of 2 made valid price conversion raise InvalidOperation and changed 39.12 × 13 from 508.56 to 510. Even the default context rounded a sufficiently long decimal just below a half tick up to the next tick.
Round prices using their exact integer ratios and half-up semantics. Construct tick prices and per-fill notionals from decimal coefficients without inheriting caller arithmetic settings. Reject non-finite prices/tick sizes with InstrumentError, and document this boundary in ADR-001.
Validation: all 48 domain tests passed, including 10 new cases and the strengthened Fill regression; full local suite: 755 passed, 150 skipped (optional C++/artifact-dependent checks); Ruff lint and formatting passed across 129 files; mypy passed for 100 source files; git diff --check passed. CI separately runs the compiled C++ differential and sanitizer jobs.