fix(schema): use big.js to avoid floating-point errors in multipleOf#259
Draft
spiderocious wants to merge 1 commit into
Draft
fix(schema): use big.js to avoid floating-point errors in multipleOf#259spiderocious wants to merge 1 commit into
spiderocious wants to merge 1 commit into
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.
Summary
Fixes
multipleOfvalidation incorrectly rejecting valid numbers due to floating-point rounding errors. For example,100withmultipleOf: 0.01was reported as invalid because100 % 0.01evaluates to0.0099...rather than0in plain JavaScript arithmetic.As suggested by @lukad in the issue, this replaces the native modulo check with arbitrary-precision arithmetic via big.js, which eliminates this class of rounding error entirely. big.js adds ~3KB
(minified + gzipped) and has zero dependencies.
Changes Made
src/validation/number.tsvalue % multipleOf !== 0check with anisMultipleOfhelper that usesbig.jsfor the modulo operation.RangeErrorbig.js throws when an operation exceeds its precision limit (e.g.1e308divided by a tinymultipleOf); in that case the value is treated as not a multiple, matching the expectedinvalidresult instead of throwing.test/json-schema-test-suite/failed-json-schema-test-suite.json"0.0075 is multiple of 0.0001"and"any integer is a multiple of 1e-8". They now pass.test/validation/number.test.ts100 / 0.01example) and a negative case (0.00751is not a multiple of0.0001) to confirm genuine non-multiples still fail.package.jsonbig.js(dependency) and@types/big.js(devDependency).Related Issues/PRs
Fixes #222
Screenshots (Before/After if applicable)
N/A — validation-only change.
Checklist