round redondear limitar float decimales con java double truncate decimalformat

redondear - ¿Cómo puedo truncar un doble a solo dos lugares decimales en Java?



math.round java dos decimales (15)

3.545555555 para obtener 3.54. Intente seguir por esto:

DecimalFormat df = new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.FLOOR); double result = new Double(df.format(3.545555555);

¡Esto dará = 3.54!

Esta pregunta ya tiene una respuesta aquí:

Por ejemplo, tengo la variable 3.545555555, que me gustaría truncar a solo 3.54.


Bit Old Forum, ninguna de las respuestas anteriores funcionó tanto para valores positivos como negativos (quiero decir para el cálculo y solo para truncar sin redondeo). Desde Cómo redondear un número hasta n lugares decimales en el enlace de Java

private static BigDecimal truncateDecimal(double x,int numberofDecimals) { if ( x > 0) { return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR); } else { return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING); } }

Este método funcionó bien para mí.

System.out.println(truncateDecimal(0, 2)); System.out.println(truncateDecimal(9.62, 2)); System.out.println(truncateDecimal(9.621, 2)); System.out.println(truncateDecimal(9.629, 2)); System.out.println(truncateDecimal(9.625, 2)); System.out.println(truncateDecimal(9.999, 2)); System.out.println(truncateDecimal(-9.999, 2)); System.out.println(truncateDecimal(-9.0, 2));

Resultados:

0.00 9.62 9.62 9.62 9.62 9.99 -9.99 -9.00


Este es el método que uso:

double a=3.545555555; // just assigning your decimal to a variable a=a*100; // this sets a to 354.555555 a=Math.floor(a); // this sets a to 354 a=a/100; // this sets a to 3.54 and thus removing all your 5''s

Esto también se puede hacer:

a=Math.floor(a*100) / 100;


Esto funcionó para mí:

double input = 104.8695412 //For example long roundedInt = Math.round(input * 100); double result = (double) roundedInt/100; //result == 104.87

Personalmente me gusta esta versión porque en realidad realiza el redondeo numéricamente, en lugar de convertirlo en una cadena (o similar) y luego formatearlo.


Formatear como una cadena y convertir de nuevo a doble, creo que le dará el resultado que desea.

El valor doble no será round (), floor () o ceil ().

Una solución rápida podría ser:

String sValue = (String) String.format("%.2f", oldValue); Double newValue = Double.parseDouble(sValue);

Puede usar sValue para fines de visualización o el nuevo valor para el cálculo.


Note primero que un double es una fracción binaria y realmente no tiene decimales.

Si necesita lugares decimales, use un BigDecimal , que tiene un método setScale() para truncamiento, o use DecimalFormat para obtener un String .


Puede usar el objeto de la clase NumberFormat para realizar la tarea.

// Creating number format object to set 2 places after decimal point NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); nf.setGroupingUsed(false); System.out.println(nf.format(precision));// Assuming precision is a double type variable


Quizás siguiendo:

double roundTwoDecimals(double d) { DecimalFormat twoDForm = new DecimalFormat("#.##"); return Double.valueOf(twoDForm.format(d)); }


Si, por algún motivo, no desea utilizar un BigDecimal , puede convertir su double en un int para truncarlo.

Si quieres truncar al lugar de Uno :

  • simplemente lanzar a int

Al décimo lugar:

  • multiplicar por diez
  • emitir a int
  • devolver al double
  • y divide por diez.

Lugar Cientos

  • multiplicar y dividir por 100, etc.

Ejemplo:

static double truncateTo( double unroundedNumber, int decimalPlaces ){ int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) ); double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) ); return truncatedNumber; }

En este ejemplo, decimalPlaces sería el número de lugares PASADOS en el lugar donde desea ir, por lo que 1 redondeará al décimo lugar, 2 a centésimas , y así sucesivamente (0 rondas al lugar de las unidades, y negativo al decenas, etc.)


Tal vez Math.floor(value * 100) / 100 ? Tenga en cuenta que los valores como 3.54 pueden no estar representados exactamente con un double .


Tengo una versión ligeramente modificada de Mani .

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) { return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN); } public static void main(String[] args) { System.out.println(truncateDecimal(0, 2)); System.out.println(truncateDecimal(9.62, 2)); System.out.println(truncateDecimal(9.621, 2)); System.out.println(truncateDecimal(9.629, 2)); System.out.println(truncateDecimal(9.625, 2)); System.out.println(truncateDecimal(9.999, 2)); System.out.println(truncateDecimal(3.545555555, 2)); System.out.println(truncateDecimal(9.0, 2)); System.out.println(truncateDecimal(-9.62, 2)); System.out.println(truncateDecimal(-9.621, 2)); System.out.println(truncateDecimal(-9.629, 2)); System.out.println(truncateDecimal(-9.625, 2)); System.out.println(truncateDecimal(-9.999, 2)); System.out.println(truncateDecimal(-9.0, 2)); System.out.println(truncateDecimal(-3.545555555, 2)); }

Salida:

0.00 9.62 9.62 9.62 9.62 9.99 9.00 3.54 -9.62 -9.62 -9.62 -9.62 -9.99 -9.00 -3.54


Una comprobación rápida es usar el método Math.floor. Creé un método para verificar un doble para dos o menos decimales a continuación:

public boolean checkTwoDecimalPlaces(double valueToCheck) { // Get two decimal value of input valueToCheck double twoDecimalValue = Math.floor(valueToCheck * 100) / 100; // Return true if the twoDecimalValue is the same as valueToCheck else return false return twoDecimalValue == valueToCheck; }


Si lo desea para fines de visualización, use java.text.DecimalFormat :

new DecimalFormat("#.##").format(dblVar);

Si lo necesita para cálculos, use java.lang.Math :

Math.floor(value * 100) / 100;


//if double_v is 3.545555555 String string_v= String.valueOf(double_v); int pointer_pos = average.indexOf(''.'');//we find the position of ''.'' string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form double_v = Double.valueOf(string_v);//well this is the final result

Bueno, esto podría ser un poco incómodo, pero creo que puede resolver su problema :)


DecimalFormat df = new DecimalFormat(fmt); df.setRoundingMode(RoundingMode.DOWN); s = df.format(d);

Compruebe RoundingMode y DecimalFormat disponibles.