truncar round redondear quitar limitar float decimales con java bigdecimal

java - round - Redondeo de valores bigdecimales con 2 lugares decimales



redondear a dos decimales java (4)

Agregue 0.001 primero al número y luego llame a 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); }

Quiero una función para convertir Bigdecimal 10.12 for 10.12345 y 10.13 for 10.12556 . Pero ninguna función está satisfaciendo ambas conversiones al mismo tiempo. Por favor, ayuda para lograr esto.

A continuación es lo que he intentado.

BigDecimal a = new BigDecimal("10.12345"); a.setScale(2, BigDecimal.ROUND_UP) a.setScale(2, BigDecimal.ROUND_CEILING) a.setScale(2, BigDecimal.ROUND_DOWN) a.setScale(2, BigDecimal.ROUND_FLOOR) a.setScale(2, BigDecimal.ROUND_HALF_DOWN) a.setScale(2, BigDecimal.ROUND_HALF_EVEN) a.setScale(2, BigDecimal.ROUND_HALF_UP)

Salida:

10.12345::10.13 10.12345::10.13 10.12345::10.12 10.12345::10.12 10.12345::10.12 10.12345::10.12 10.12345::10.12 BigDecimal b = new BigDecimal("10.12556"); b.setScale(2, BigDecimal.ROUND_UP) b.setScale(2, BigDecimal.ROUND_CEILING) b.setScale(2, BigDecimal.ROUND_DOWN) b.setScale(2, BigDecimal.ROUND_FLOOR) b.setScale(2, BigDecimal.ROUND_HALF_DOWN) b.setScale(2, BigDecimal.ROUND_HALF_EVEN) b.setScale(2, BigDecimal.ROUND_HALF_UP)

Salida:

10.12556::10.13 10.12556::10.13 10.12556::10.12 10.12556::10.12 10.12556::10.12 10.12556::10.12 10.12556::10.12


Creo que el RoundingMode que estás buscando es ROUND_HALF_EVEN . Desde el javadoc :

Modo de redondeo para redondear hacia el "vecino más cercano" a menos que ambos vecinos estén equidistantes, en cuyo caso, redondear hacia el vecino par. Se comporta como para ROUND_HALF_UP si el dígito a la izquierda de la fracción descartada es impar; se comporta como para 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 en 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


Puede llamar al setScale(newScale, roundingMode) tres veces cambiando el valor de 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


Puedes probar esto:

public static void main(String[] args) { BigDecimal a = new BigDecimal("10.12345"); System.out.println(toPrecision(a, 2)); } private static BigDecimal toPrecision(BigDecimal dec, int precision) { String plain = dec.movePointRight(precision).toPlainString(); return new BigDecimal(plain.substring(0, plain.indexOf("."))).movePointLeft(precision); }

SALIDA:

10.12