Commit 70a8bf6
committed
fix: resolve floating-point precision bug in multipleOf validation
- Issue: Validator::isFloat()->multipleOf(0.01)->validate(500.01) failed due to precision
- Root cause: fmod(500.01, 0.01) returned 0.009999999999980497 instead of 0.0
- Solution: Implement epsilon comparison (1e-9 tolerance) for floating-point remainders
- Impact: Decimal multiples (currency, measurements) now validate correctly
Technical details:
- Enhanced multipleOf() with dual condition: abs(remainder) < epsilon || abs(remainder - divisor) < epsilon
- Maintains integer path performance (no epsilon needed for exact arithmetic)
- Handles both near-zero and near-divisor remainder cases
Examples now working:
- 500.01 multipleOf 0.01 ✅
- 19.99 multipleOf 0.01 ✅
- 1234.56 multipleOf 0.01 ✅
- Add comprehensive test coverage for floating-point precision edge cases
- Update project documentation with bug fix details
- Total test suite: 127 tests, 363 assertions1 parent 98d3f24 commit 70a8bf6
6 files changed
Lines changed: 31 additions & 5 deletions
File tree
- src/Lemmon
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
16 | 22 | | |
17 | 23 | | |
18 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
| 51 | + | |
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| 59 | + | |
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
304 | 304 | | |
305 | 305 | | |
306 | 306 | | |
307 | | - | |
| 307 | + | |
308 | 308 | | |
309 | 309 | | |
310 | 310 | | |
311 | 311 | | |
| 312 | + | |
312 | 313 | | |
313 | 314 | | |
314 | 315 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
57 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
58 | 62 | | |
59 | 63 | | |
60 | 64 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
0 commit comments