Skip to content

Commit 7b3d64f

Browse files
committed
Handle trailing zeros of BigDecimal in MessagePackGenerator
1 parent 9ad0405 commit 7b3d64f

File tree

2 files changed

+5
-2
lines changed

2 files changed

+5
-2
lines changed

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ private void packBigDecimal(BigDecimal decimal)
244244
if (failedToPackAsBI) {
245245
double doubleValue = decimal.doubleValue();
246246
//Check to make sure this BigDecimal can be represented as a double
247-
if (!decimal.toEngineeringString().equals(BigDecimal.valueOf(doubleValue).toEngineeringString())) {
247+
if (!decimal.stripTrailingZeros().toEngineeringString().equals(BigDecimal.valueOf(doubleValue).toEngineeringString())) {
248248
throw new IllegalArgumentException("MessagePack cannot serialize a BigDecimal that can't be represented as double. " + decimal);
249249
}
250250
messagePacker.packDouble(doubleValue);

msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,11 @@ public void testBigDecimal()
285285
{
286286
double d0 = 1.23456789;
287287
double d1 = 1.23450000000000000000006789;
288+
String d2 = "12.30";
288289
List<BigDecimal> bigDecimals = Arrays.asList(
289290
BigDecimal.valueOf(d0),
290291
BigDecimal.valueOf(d1),
292+
new BigDecimal(d2),
291293
BigDecimal.valueOf(Double.MIN_VALUE),
292294
BigDecimal.valueOf(Double.MAX_VALUE),
293295
BigDecimal.valueOf(Double.MIN_NORMAL)
@@ -296,9 +298,10 @@ public void testBigDecimal()
296298
byte[] bytes = mapper.writeValueAsBytes(bigDecimals);
297299
MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes);
298300

299-
assertEquals(5, unpacker.unpackArrayHeader());
301+
assertEquals(bigDecimals.size(), unpacker.unpackArrayHeader());
300302
assertEquals(d0, unpacker.unpackDouble(), 0.000000000000001);
301303
assertEquals(d1, unpacker.unpackDouble(), 0.000000000000001);
304+
assertEquals(Double.valueOf(d2), unpacker.unpackDouble(), 0.000000000000001);
302305
assertEquals(Double.MIN_VALUE, unpacker.unpackDouble(), 0.000000000000001);
303306
assertEquals(Double.MAX_VALUE, unpacker.unpackDouble(), 0.000000000000001);
304307
assertEquals(Double.MIN_NORMAL, unpacker.unpackDouble(), 0.000000000000001);

0 commit comments

Comments
 (0)