redondear hasta 2 decimales en java? [duplicar]

He leído muchas preguntas de stackoverflow pero ninguna parece funcionar para mí. estoy usando math.round() para redondear este es el codigo:

class round{
    public static void main(String args[]){

    double a = 123.13698;
    double roundOff = Math.round(a*100)/100;

    System.out.println(roundOff);
}
}

la salida que obtengo es: 123 pero quiero que sea 123.14. lo leí agregando *100/100 ayudará, pero como puede ver, no logré que funcionara.

es absolutamente esencial que tanto la entrada como la salida sean dobles.

sería de gran ayuda si cambia la línea 4 del código anterior y lo publica.

preguntado el 28 de julio de 12 a las 14:07

Con la técnica * 100/100 utilizada anteriormente, creo que desea truncar, no redondear. Math.floor(a*100) / 100d) Piensa en lo que están haciendo las matemáticas: 123.1299 * 100 = 12312.99. Floor() = 12312.0 luego /100 = 123.12 -

stackoverflow.com/a/10959430/621951 la mejor solución. Funciona. -

Prueba Math.round(a * 100) / 100d; -

12 Respuestas

Bueno, este funciona...

double roundOff = Math.round(a * 100.0) / 100.0;

La salida es

123.14

O como dijo @Rufein

 double roundOff = (double) Math.round(a * 100) / 100;

esto también lo hará por ti.

Respondido el 05 de diciembre de 13 a las 20:12

¿Podría ajustarse esto para redondear a 3 o 5 decimales? - Muhammad Gelbana

Tambien funciona double roundOff = (double) Math.round(a * 100) / 100; - Rufein

pues sí, porque en realidad me pasó a mí :) - Martín Asenov

Todavía me pregunto por qué nadie mencionó new BigDecimal(123.13698).round(new MathContext(5)).doubleValue() - george_h

( Math.round(395.0349999999 * 100 ) / 100.0. ) se convertirá en 395.03. Puedo ver por qué como 395034 es el largo más cercano que luego se divide por 100. Sin embargo, creo que, en general, la gente esperaría el resultado como 395.04. - Vishal Saxena

String roundOffTo2DecPlaces(float val)
{
    return String.format("%.2f", val);
}

Respondido 28 Jul 12, 14:07

@CarlosA.Junior, ¿usted dice que usar la forma anterior no daría resultados consistentes? - Arun

Sí @Arun. Usando String.format, puedo formatear de la misma manera que mi país usa para redondear los lugares decimales de los impuestos. - Carlos Spohr

     double d = 2.34568;
     DecimalFormat f = new DecimalFormat("##.00");
     System.out.println(f.format(d));

Respondido 28 Jul 12, 14:07

dice DecimalFormat cannot be resolved to a type - Aayush Mahajan

importaste java.text.DecimalFormat; ? - amichhajer

eso funciona solo si el número doble no es menor que 1 y mayor que -1; cuando eso sucede, no muestra 0. - lukaszrys

doble dobleValor = 245; FormatoDecimal df = new FormatoDecimal("##.00"); System.out.println("valor: " + Float.valueOf(df.format(doubleValue))); imprime 245.0 no 245.00 - anushree acharjee

El formato decimal no redondea el último valor decimal de ninguna de sus funciones. El margen para el redondeo de todas las funciones es >5 pero se supone que es >4. Por ejemplo, 1.235 debería redondearse a 1.24, pero el formato DF lo redondea a 1.23, lo cual es incorrecto. Pero Math.round es preciso. - Arunchunaivendan

BigDecimal a = new BigDecimal("123.13698");
BigDecimal roundOff = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(roundOff);

Respondido 20 Oct 13, 20:10

BigDecimal.ROUND* está en desuso desde Java 9. - Det

Sí, para Java 9+, use RoundingMode.HALF_EVEN para replicar esta solución - Martín Bjeldbak Madsen

double roundOff = Math.round(a*100)/100;

debiera ser

double roundOff = Math.round(a*100)/100D;

Agregar 'D' a 100 lo convierte en doble literal, por lo que el resultado producido tendrá precisión

Respondido 28 Jul 12, 15:07

no funciona, el resultado sigue siendo 123.0 - Aayush Mahajan

He movido 'F' al denominador ahora. Debería funcionar ahora - Arun

la salida está aún más desordenada. 123.13999938964844 - Aayush Mahajan

Sé que esta es una pregunta de hace 2 años, pero como todos enfrentan un problema para redondear los valores en algún momento. Me gustaría compartir una forma diferente que nos puede dar valores redondeados a cualquier escala usando BigDecimal clase. Aquí podemos evitar pasos adicionales que se requieren para obtener el valor final si usamos DecimalFormat("0.00") o utilizando Math.round(a * 100) / 100 .

import java.math.BigDecimal;

public class RoundingNumbers {
    public static void main(String args[]){
        double number = 123.13698;
        int decimalsToConsider = 2;
        BigDecimal bigDecimal = new BigDecimal(number);
        BigDecimal roundedWithScale = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with setting scale = "+roundedWithScale);

        bigDecimal = new BigDecimal(number);
        BigDecimal roundedValueWithDivideLogic = bigDecimal.divide(BigDecimal.ONE,decimalsToConsider,BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with Dividing by one = "+roundedValueWithDivideLogic);

    }
}

Este programa nos daría por debajo de la salida

Rounded value with setting scale = 123.14
Rounded value with Dividing by one = 123.14

respondido 10 mar '15, 07:03

También podrías usar BigDecimal.ROUND_HALF_EVEN para lograr una lógica similar como Math.round() (1.204 = 1.20, 1.205 = 1.21). - zoku

Tratar :

class round{
public static void main(String args[]){

double a = 123.13698;
double roundOff = Math.round(a*100)/100;
String.format("%.3f", roundOff); //%.3f defines decimal precision you want
System.out.println(roundOff);   }}

respondido 16 mar '15, 05:03

parece que te golpea la aritmética de enteros: en algunos idiomas (int)/(int) siempre se evaluará como aritmética de enteros. para forzar la aritmética de punto flotante, asegúrese de que al menos uno de los operandos no sea un entero:

double roundOff = Math.round(a*100)/100.f;

Respondido 28 Jul 12, 14:07

con double roundOff = Math.round(a*100F)/100.f; la salida está aún más desordenada. está: 123.13999938964844 - Aayush Mahajan

¿Está interesado en imprimir el número redondeado o en evaluar el número redondeado (para hacer algo con él)? si solo está imprimiendo, debe buscar la documentación para println. si está interesado en los números, entonces supongo (sin haberlo confirmado) que la salida "desordenada" es realmente correcta, ya que es el punto flotante de cierre equivalente a "123.14" (verifique este) - umläute

Vuelva a su código y reemplace 100 by 100.00 y avísame si funciona. Sin embargo, si quieres ser formal, prueba esto:

import java.text.DecimalFormat;
DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value); 
double finalValue = (Double)df.parse(formate) ;

Respondido 28 Jul 12, 14:07

Esta es una solución larga pero de prueba completa, nunca falla

Simplemente pase su número a esta función como un doble, lo devolverá redondeando el valor decimal al valor más cercano de 5;

si 4.25, Salida 4.25

si 4.20, Salida 4.20

si 4.24, Salida 4.20

si 4.26, Salida 4.30

si desea redondear hasta 2 decimales, utilice

DecimalFormat df = new DecimalFormat("#.##");
roundToMultipleOfFive(Double.valueOf(df.format(number)));

si hay hasta 3 lugares, new DecimalFormat("#.###")

si hay hasta n lugares, new DecimalFormat("#.n Veces #")

 public double roundToMultipleOfFive(double x)
            {

                x=input.nextDouble();
                String str=String.valueOf(x);
                int pos=0;
                for(int i=0;i<str.length();i++)
                {
                    if(str.charAt(i)=='.')
                    {
                        pos=i;
                        break;
                    }
                }

                int after=Integer.parseInt(str.substring(pos+1,str.length()));
                int Q=after/5;
                int R =after%5;

                if((Q%2)==0)
                {
                    after=after-R;
                }
                else
                {
                   if(5-R==5)
                   {
                     after=after;
                   }
                   else after=after+(5-R);
                }

                       return Double.parseDouble(str.substring(0,pos+1).concat(String.valueOf(after))));

            }

respondido 13 mar '15, 12:03

Acabo de modificar tu código. Funciona bien en mi sistema. A ver si esto ayuda

class round{
    public static void main(String args[]){

    double a = 123.13698;
    double roundOff = Math.round(a*100)/100.00;

    System.out.println(roundOff);
}
}

Respondido 28 Jul 12, 15:07

public static float roundFloat(float in) {
    return ((int)((in*100f)+0.5f))/100f;
}

Debería estar bien para la mayoría de los casos. Todavía puede cambiar los tipos si desea cumplir con los dobles, por ejemplo.

Respondido 10 ago 13, 15:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.