BigDecimal setScale y redondos

¿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); 

Un punto importante al que se alude pero que no se aborda directamente es la diferencia entre “precisión” y “escala” y cómo se usan en las dos afirmaciones. “precisión” es la cantidad total de dígitos significativos en un número. “escala” es la cantidad 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 un argumento, así como RoundingMode, sin embargo, la precisión nunca se especifica en la segunda statement.

Si mueve el punto decimal un lugar a la derecha, la diferencia quedará clara:

 // 1. new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP)); //result = 35.35 // 2. new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP); // result = 35.3456 

De hecho, hay una gran diferencia, que debes 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 dentro de jdk. Entonces, con respecto a su muestra, los resultados son los mismos, pero intente con 0.0034 en su lugar. Aquí está mi nota sobre eso en mi blog:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html