Solución:
Como se especifica en javadoc, un BigDecimal
está definido por un valor entero y un escala.
Por lo tanto, el valor del número representado por BigDecimal es (unscaledValue × 10 ^ (- scale)).
Entonces BigDecimal("1761e+5")
tiene escala -5 y BigDecimal(176100000)
tiene escala 0.
La división de los dos BigDecimal
se realiza utilizando las escalas -5 y 0 respectivamente porque las escalas no se especifican al dividir. los divide
La documentación explica por qué los resultados son diferentes.
divide
public BigDecimal divide(BigDecimal divisor)
Devuelve un
BigDecimal
cuyo valor es(this / divisor)
, y cuya escala preferida es(this.scale() - divisor.scale())
; si el cociente exacto no se puede representar (porque tiene una expansión decimal no terminante) unArithmeticException
es aventado.Parámetros:
divisor
– valor por el que se dividirá este BigDecimal.Devoluciones:
this / divisor
Lanza:
ArithmeticException
– si el cociente exacto no tiene una expansión decimal finalYa que:
1,5
Si especifica una escala al dividir, p. Ej. dividendo.divide(BigDecimal.valueOf(1000), 0, RoundingMode.HALF_UP)
obtendrá el mismo resultado.
Las expresiones new BigDecimal("176100000")
y new BigDecimal("1761e+5")
están no es igual. BigDecimal
realiza un seguimiento del valor y la precisión.
BigDecimal("176100000")
tiene 9 dígitos de precisión y se representa internamente como el BigInteger("176100000")
, multiplicado por 1. BigDecimal("1761e+5")
tiene 4 dígitos de precisión y se representa internamente como el BigInteger("1761")
, multiplicado por 100000.
Cuando divides un BigDecimal
por un valor, el resultado respeta los dígitos de precisión, lo que da como resultado diferentes salidas para valores aparentemente iguales.
para su división con BigDecimal.
dividendo.divide(divisor,2,RoundingMode.CEILING)//00.00 nothing for up and nothing for down
en esta operación tienen una precisión de dos decimales.