Estaba probando condiciones de límite en algún código que involucraba a BigDecimal
, y noté que cuando BigDecimal
se inicializa a con String, "1e2147483647"
se comporta inesperadamente. Parece tener un valor entre 0
y 1e-2147483647
. Cuando intento llamar intValue()
, obtengo un NegativeArraySizeException
. Debo notar que 2147483647
es 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-2147483647
es 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
BigDecimal
s, 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.scale
es-2147483647
.this.precision() - this.scale
por lo tanto, se desborda y el siguiente desbordamiento no se maneja correctamente.Este error se ha corregido en JDK8 haciendo la resta en
long
aritmética .fuente