diff --git a/msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java b/msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java index 9ba9a5ac3..189197209 100644 --- a/msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java +++ b/msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java @@ -244,7 +244,7 @@ private void packBigDecimal(BigDecimal decimal) if (failedToPackAsBI) { double doubleValue = decimal.doubleValue(); //Check to make sure this BigDecimal can be represented as a double - if (!decimal.toEngineeringString().equals(BigDecimal.valueOf(doubleValue).toEngineeringString())) { + if (!decimal.stripTrailingZeros().toEngineeringString().equals(BigDecimal.valueOf(doubleValue).toEngineeringString())) { throw new IllegalArgumentException("MessagePack cannot serialize a BigDecimal that can't be represented as double. " + decimal); } messagePacker.packDouble(doubleValue); diff --git a/msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java b/msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java index 68eaa4557..b88d0d645 100644 --- a/msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java +++ b/msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java @@ -285,9 +285,11 @@ public void testBigDecimal() { double d0 = 1.23456789; double d1 = 1.23450000000000000000006789; + String d2 = "12.30"; List bigDecimals = Arrays.asList( BigDecimal.valueOf(d0), BigDecimal.valueOf(d1), + new BigDecimal(d2), BigDecimal.valueOf(Double.MIN_VALUE), BigDecimal.valueOf(Double.MAX_VALUE), BigDecimal.valueOf(Double.MIN_NORMAL) @@ -296,9 +298,10 @@ public void testBigDecimal() byte[] bytes = mapper.writeValueAsBytes(bigDecimals); MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes); - assertEquals(5, unpacker.unpackArrayHeader()); + assertEquals(bigDecimals.size(), unpacker.unpackArrayHeader()); assertEquals(d0, unpacker.unpackDouble(), 0.000000000000001); assertEquals(d1, unpacker.unpackDouble(), 0.000000000000001); + assertEquals(Double.valueOf(d2), unpacker.unpackDouble(), 0.000000000000001); assertEquals(Double.MIN_VALUE, unpacker.unpackDouble(), 0.000000000000001); assertEquals(Double.MAX_VALUE, unpacker.unpackDouble(), 0.000000000000001); assertEquals(Double.MIN_NORMAL, unpacker.unpackDouble(), 0.000000000000001);