¿Cuál es la diferencia entre estas dos llamadas? (¿Hay alguna?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
java
bigdecimal
usuario
fuente
fuente
round
método también devuelve una nueva instancia de BigDecimal porque, como dijiste, las instancias son inmutables.Respuestas:
Un punto importante al que se alude pero no se aborda directamente es la diferencia entre "precisión" y "escala" y cómo se usan en las dos afirmaciones. "precisión" es el número total de dígitos significativos en un número. "escala" es el número de dígitos a la derecha del punto decimal.
El constructor MathContext solo acepta precisión y RoundingMode como argumentos y, por lo tanto, la escala nunca se especifica en la primera instrucción.
setScale()
obviamente acepta la escala como argumento, así como RoundingMode, sin embargo, la precisión nunca se especifica en la segunda declaración.Si mueve el punto decimal un lugar a la derecha, la diferencia quedará clara:
fuente
De hecho, hay una gran diferencia, que debe tener en cuenta. setScale realmente establece la escala de su número, mientras que round redondea su número a los dígitos especificados PERO "comienza desde el dígito más a la izquierda del resultado exacto" como se menciona en el jdk. Entonces, con respecto a su muestra, los resultados son los mismos, pero intente 0.0034 en su lugar. Aquí está mi nota al respecto en mi blog:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
fuente