2010-10-01 18 views
101

¿Cuál es la diferencia entre estas dos llamadas? (¿Hay alguno?)BigDecimal setScale y ronda

// 1. 
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP)); 
// 2. 
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP); 
+5

aparte de respuestas aceptadas por debajo de - setScale() crea un nuevo objeto de BigDecimal - dada su una clase inmutable – prash

+4

@prash el método 'round' también devuelve una nueva instancia de BigDecimal porque, como dijiste, las instancias son inmutables. – megaflop

Respuesta

156

Un punto importante que se alude, pero no aborda directamente es la diferencia entre "precisión" "escala" y y cómo se utilizan en las dos declaraciones. "precisión" es el número total de dígitos significativos en un número. "scale" es el número de dígitos a la derecha del punto decimal.

El constructor MathContext solo acepta precisión y RoundingMode como argumentos, por lo que 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 instrucción.

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

// 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 
+26

Re: "" precisión "es el número total de dígitos en un número." No. La precisión es la cantidad de dígitos significativos. La precisión de 0.000042M es 2. –

+0

Consulte: "precisión": el conteo de dígitos comienza desde el dígito no nulo más a la izquierda del resultado exacto. https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html – Eddy

+0

si "Precisión es el número de dígitos significativos" de por qué la precisión de 0.0000009 viene como 2? debería ser 1 –

44

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 dentro de jdk. Entonces, con respecto a su muestra, los resultados son los mismos, pero intente con 0.0034 en su lugar. Aquí es mi nota sobre eso en mi blog:

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