diff --git a/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java index 7928cb0d4..04f5b14fe 100644 --- a/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java +++ b/src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java @@ -493,6 +493,9 @@ private T toNumber(final Class sourceType, final Class targetType, fin if (value instanceof BigDecimal) { return targetType.cast(((BigDecimal) value).toBigInteger()); } + if (value instanceof Float || value instanceof Double) { + return targetType.cast(new BigDecimal(value.toString()).toBigInteger()); + } return targetType.cast(BigInteger.valueOf(value.longValue())); } diff --git a/src/test/java/org/apache/commons/beanutils2/converters/BigIntegerConverterTest.java b/src/test/java/org/apache/commons/beanutils2/converters/BigIntegerConverterTest.java index 0f266c1cf..f56ef0665 100644 --- a/src/test/java/org/apache/commons/beanutils2/converters/BigIntegerConverterTest.java +++ b/src/test/java/org/apache/commons/beanutils2/converters/BigIntegerConverterTest.java @@ -19,6 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import java.math.BigDecimal; import java.math.BigInteger; import org.apache.commons.beanutils2.Converter; @@ -62,6 +63,15 @@ public void tearDown() throws Exception { converter = null; } + @Test + void testLargeFloatingPointMagnitude() { + // A Float or Double beyond long range must keep its magnitude instead of saturating to Long.MAX_VALUE. + final Double bigDouble = Double.valueOf(1.0e30); + assertEquals(new BigDecimal(bigDouble.toString()).toBigInteger(), converter.convert(BigInteger.class, bigDouble)); + final Float bigFloat = Float.valueOf(1.0e20f); + assertEquals(new BigDecimal(bigFloat.toString()).toBigInteger(), converter.convert(BigInteger.class, bigFloat)); + } + @Test void testSimpleConversion() throws Exception { final String[] message = { "from String", "from String", "from String", "from String", "from String", "from String", "from String", "from Byte",