Estaba probando condiciones de límite en algún código que involucraba a BigDecimal, y noté que cuando BigDecimalse inicializa a con String, "1e2147483647"se comporta inesperadamente. Parece tener un valor entre 0y 1e-2147483647. Cuando intento llamar intValue(), obtengo un NegativeArraySizeException. Debo notar que 2147483647es el valor máximo de un número entero en mi sistema. ¿Estoy haciendo algo mal o es un problema BigDecimal?
BigDecimal test = new BigDecimal("1e2147483647");
test.compareTo(new BigDecimal(0)); //Returns 1
test.compareTo(new BigDecimal("1e-2147483647")); //Returns -1
test.intValue(); //Throws NegativeArraySizeException
java
bigdecimal
DJMatch3000
fuente
fuente

1e-2147483647es un número bastante grande. Para ser precisos,log_2(10^2147483647) / 8 / 1024^3 = 0.83...debería producir el tamaño mínimo (en Gigabytes) para representar un número tan grande como un entero. ¿Quizás esto sea algún tipo de problema de asignación de memoria?BigDecimal. Tu error es legítimo.Respuestas:
No, parece que tienes un error legítimo. El error se presenta en JDK7 pero corregido en JDK8. Sus valores se pueden representar correctamente como
BigDecimals, y deberían comportarse correctamente, pero no lo hacen.El rastreo a través del código fuente de
BigDecimal, en la línea 2585,this.precision()es 1 ythis.scalees-2147483647.this.precision() - this.scalepor lo tanto, se desborda y el siguiente desbordamiento no se maneja correctamente.Este error se ha corregido en JDK8 haciendo la resta en
longaritmética .fuente