Skip to content

Commit 6b9266d

Browse files
committed
Merge pull request #434 from fge/decimalnode-equals
Ensure that DecimalNodes with mathematically equal values are equal
2 parents aec6276 + 1b8244e commit 6b9266d

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/main/java/com/fasterxml/jackson/databind/node/DecimalNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ public boolean equals(Object o)
116116
if (o == this) return true;
117117
if (o == null) return false;
118118
if (o instanceof DecimalNode) {
119-
return ((DecimalNode) o)._value.equals(_value);
119+
return ((DecimalNode) o)._value.compareTo(_value) == 0;
120120
}
121121
return false;
122122
}
123123

124124
@Override
125-
public int hashCode() { return _value.hashCode(); }
125+
public int hashCode() { return Double.valueOf(doubleValue()).hashCode(); }
126126
}

src/test/java/com/fasterxml/jackson/databind/node/TestNumberNodes.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,33 @@ public void testDecimalNode() throws Exception
184184
assertTrue(DecimalNode.valueOf(BigDecimal.valueOf(Long.MIN_VALUE)).canConvertToLong());
185185
}
186186

187+
public void testDecimalNodeEqualsHashCode()
188+
{
189+
/*
190+
* We want DecimalNodes with equivalent _numeric_ values to be equal;
191+
* this is not the case for BigDecimal where "1.0" and "1" are not
192+
* equal!
193+
*/
194+
BigDecimal b1 = BigDecimal.ONE;
195+
BigDecimal b2 = new BigDecimal("1.0");
196+
BigDecimal b3 = new BigDecimal("0.01e2");
197+
BigDecimal b4 = new BigDecimal("1000e-3");
198+
199+
DecimalNode node1 = new DecimalNode(b1);
200+
DecimalNode node2 = new DecimalNode(b2);
201+
DecimalNode node3 = new DecimalNode(b3);
202+
DecimalNode node4 = new DecimalNode(b4);
203+
204+
assertEquals(node1.hashCode(), node2.hashCode());
205+
assertEquals(node2.hashCode(), node3.hashCode());
206+
assertEquals(node3.hashCode(), node4.hashCode());
207+
208+
assertEquals(node1, node2);
209+
assertEquals(node2, node1);
210+
assertEquals(node2, node3);
211+
assertEquals(node3, node4);
212+
}
213+
187214
public void testBigIntegerNode() throws Exception
188215
{
189216
BigIntegerNode n = BigIntegerNode.valueOf(BigInteger.ONE);

0 commit comments

Comments
 (0)