diff --git a/src/main/java/com/rabbitmq/client/impl/ValueWriter.java b/src/main/java/com/rabbitmq/client/impl/ValueWriter.java index 28d516dec4..ab65b95aeb 100644 --- a/src/main/java/com/rabbitmq/client/impl/ValueWriter.java +++ b/src/main/java/com/rabbitmq/client/impl/ValueWriter.java @@ -145,7 +145,9 @@ else if(value instanceof BigDecimal) { BigDecimal decimal = (BigDecimal)value; writeOctet(decimal.scale()); BigInteger unscaled = decimal.unscaledValue(); - if(unscaled.bitLength() > 32) /*Integer.SIZE in Java 1.5*/ + // We use 31 instead of 32 because bitLength ignores the sign bit, + // so e.g. new BigDecimal(Integer.MAX_VALUE) comes out to 31 bits. + if(unscaled.bitLength() > 31) /*Integer.SIZE in Java 1.5*/ throw new IllegalArgumentException ("BigDecimal too large to be encoded"); writeLong(decimal.unscaledValue().intValue());