sumar setscale round multiply decimals java bigdecimal

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 .