Skip to content

Commit f54ed47

Browse files
committed
Improve accuracy of rounding with multipleOf
1 parent d95b85b commit f54ed47

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

src/main/java/com/networknt/schema/MultipleOfValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Set<ValidationMessage> validate(JsonNode node, JsonNode rootNode, String
4848
// convert to BigDecimal since double type is not accurate enough to do the division and multiple
4949
BigDecimal accurateDividend = new BigDecimal(String.valueOf(nodeValue));
5050
BigDecimal accurateDivisor = new BigDecimal(String.valueOf(divisor));
51-
if (Math.abs(accurateDividend.divideAndRemainder(accurateDivisor)[1].doubleValue()) > 1e-12) {
51+
if ((accurateDividend.divideAndRemainder(accurateDivisor)[1].abs().compareTo(BigDecimal.ZERO) > 0)) {
5252
return Collections.singleton(buildValidationMessage(at, "" + divisor));
5353
}
5454
}

src/test/resources/draft4/multipleOf.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,31 @@
8989
"valid": true
9090
}
9191
]
92+
},
93+
{
94+
"description": "by deep rounding",
95+
"schema": {"multipleOf": 0.25},
96+
"tests": [
97+
{
98+
"description": "8.75 is multiple of 0.25",
99+
"data": 8.75,
100+
"valid": true
101+
},
102+
{
103+
"description": "8.750000000001 is not multiple of 0.25",
104+
"data": 8.750000000001,
105+
"valid": false
106+
},
107+
{
108+
"description": "8.7500000000001 is not multiple of 0.25",
109+
"data": 8.7500000000001,
110+
"valid": false
111+
},
112+
{
113+
"description": "8.75000000000001 is not multiple of 0.25",
114+
"data": 8.75000000000001,
115+
"valid": false
116+
}
117+
]
92118
}
93119
]

src/test/resources/draft6/multipleOf.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,31 @@
5656
"valid": false
5757
}
5858
]
59+
},
60+
{
61+
"description": "by deep rounding",
62+
"schema": {"multipleOf": 0.25},
63+
"tests": [
64+
{
65+
"description": "8.75 is multiple of 0.25",
66+
"data": 8.75,
67+
"valid": true
68+
},
69+
{
70+
"description": "8.750000000001 is not multiple of 0.25",
71+
"data": 8.750000000001,
72+
"valid": false
73+
},
74+
{
75+
"description": "8.7500000000001 is not multiple of 0.25",
76+
"data": 8.7500000000001,
77+
"valid": false
78+
},
79+
{
80+
"description": "8.75000000000001 is not multiple of 0.25",
81+
"data": 8.75000000000001,
82+
"valid": false
83+
}
84+
]
5985
}
6086
]

src/test/resources/draft7/multipleOf.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,31 @@
5656
"valid": false
5757
}
5858
]
59+
},
60+
{
61+
"description": "by deep rounding",
62+
"schema": {"multipleOf": 0.25},
63+
"tests": [
64+
{
65+
"description": "8.75 is multiple of 0.25",
66+
"data": 8.75,
67+
"valid": true
68+
},
69+
{
70+
"description": "8.750000000001 is not multiple of 0.25",
71+
"data": 8.750000000001,
72+
"valid": false
73+
},
74+
{
75+
"description": "8.7500000000001 is not multiple of 0.25",
76+
"data": 8.7500000000001,
77+
"valid": false
78+
},
79+
{
80+
"description": "8.75000000000001 is not multiple of 0.25",
81+
"data": 8.75000000000001,
82+
"valid": false
83+
}
84+
]
5985
}
6086
]

0 commit comments

Comments
 (0)