Esta es la solución más completa que te podemos brindar, pero primero obsérvala pausadamente y analiza si es compatible a tu trabajo.
Solución:
Yo creo que el RoundingMode
lo que buscas es ROUND_HALF_EVEN
. Del javadoc:
Modo de redondeo para redondear hacia el “vecino más cercano” a menos que ambos vecinos sean equidistantes, en cuyo caso, redondear hacia el vecino par. Se comporta como ROUND_HALF_UP si el dígito a la izquierda de la fracción descartada es impar; se comporta como ROUND_HALF_DOWN si es par. Tenga en cuenta que este es el modo de redondeo que minimiza el error acumulativo cuando se aplica repetidamente sobre una secuencia de cálculos.
Aquí hay un caso de prueba rápida:
BigDecimal a = new BigDecimal("10.12345");
BigDecimal b = new BigDecimal("10.12556");
a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(a);
System.out.println(b);
Imprime correctamente:
10.12
10.13
ACTUALIZAR:
setScale(int, int)
no se ha recomendado desde Java 1.5, cuando se introdujeron las enumeraciones por primera vez, y finalmente quedó en desuso en Java 9. Ahora debe usar setScale(int, RoundingMode)
p.ej:
setScale(2, RoundingMode.HALF_EVEN)
Agregar 0.001
primero al número y luego llamar setScale(2, RoundingMode.ROUND_HALF_UP)
Ejemplo de código:
public static void main(String[] args)
BigDecimal a = new BigDecimal("10.12445").add(new BigDecimal("0.001"));
BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(b);
Puedes llamar setScale(newScale, roundingMode)
método tres veces cambiando el valor newScale de 4 a 3 a 2 como
primer caso
BigDecimal a = new BigDecimal("10.12345");
a = a.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.1235
a = a.setScale(3, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.124
a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.12
segundo caso
BigDecimal a = new BigDecimal("10.12556");
a = a.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.1256
a = a.setScale(3, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.126
a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + a); //10.13
Si para ti ha sido provechoso nuestro post, nos gustaría que lo compartas con otros seniors y nos ayudes a difundir nuestro contenido.