setscale - Java BigDecimal Posible error de desbordamiento
string to bigdecimal java (1)
Estaba probando condiciones límite en algún código que involucra un
BigDecimal
, y noté que cuando un
BigDecimal
se inicializa con la Cadena
"1e2147483647"
se comporta inesperadamente.
Parece tener un valor entre
0
y
1e-2147483647
.
Cuando intento llamar a
intValue()
, obtengo una
NegativeArraySizeException
.
Debo señalar que
2147483647
es el valor máximo de un entero en mi sistema.
¿Estoy haciendo algo mal o es un problema con
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
No, parece que tienes un error legítimo.
El error se presenta en JDK7 pero se solucionó en JDK8.
Sus valores son correctamente representables como
BigDecimal
s, y deberían comportarse correctamente, pero no lo hacen.
Rastreando a través
del código fuente de
BigDecimal
, en la línea 2585,
this.precision()
es 1, y
this.scale
es
-2147483647
.
this.precision() - this.scale
por
this.precision() - this.scale
tanto, se desborda y el siguiente desbordamiento no se maneja correctamente.
Este error
se ha solucionado
en JDK8
haciendo la resta en aritmética
long
.