Redondear Decimales en Java

Publicado: 20 octubre 2009 en Java, Tips

Continuando con el ciclo de tips en el lenguaje #java en esta ocasion les presento un metodo muy utilizado y muy rebuscado en #SanGoogle, el metodo para redondeo de double a una cierta cantidad de decimales. Despues de haber encontrado un sin numero de metodos en internet, de los cuales algunos no hacian lo que necesitaba encontre este metodo conversando con un amigo mio en el trabajo. Este metodo usa el metodo rint() de la clase Math de java, este metodo tiene la peculiaridad de redondear al entero mayor o igual al numero double que estee en su argumento.

Veamos el metodo: (para un redondeo a 2 decimales)

public double Redondear(double numero)
{
       return Math.rint(numero*100)/100;
}

Bien expliquemos que hace el metodo, primero multiplicamos por una potencia de 10 al numero que deseamos redondear, en este caso 10 al cuadrado (la potencia de 10 depende del numero de cifras a las cuales queremos redondear, si queremos redondear a 4 difras elevamos a la potencia 4 esto seria 10000), luego lo pasamos como parametro del metodo ya mencionado rint(), luego el resultado lo dividimos por la misma potencia de 10 por la que multiplicamos (en este caso cuadrado) para retornar al valor incial redondeado la posicion de la coma dentro del numero .

Veamos un ejemplo:
Sea el numero 25.63874 y queremos redondearlo a 3 cifras, entonces el metodo tiene que ser redefinido como comentamos en un principio, multiplicar por la potencia de 10, en este caso elevarlo al cubo ya que redondearemos a 3 cifras y modificar el metodo como lo mostramos a continuación.


public double Redondear(double numero)
{
      return Math.rint(numero*1000)/1000;
}

Despues de mandar como parametro del metodo Redondear el numero 25.65874, obtendremos 25.659 que es el redondeo a 3 cifras del número.
Si gustan pueden implementar su metodo que les permita pasar la cantidad de cifras a redondear, eso se los dejo como tarea a ustedes.

Un saludo y espero les sirva este método.

Actualizacion:

Aqui les dejo el método Redondear con 2 argumentos, el primero es el número a redondear y el segundo es la cantidad de digitos a redondear. Simplemente usaremos los metodos de la clase Math de Java.


public static double Redondear(double numero,int digitos)
{
      int cifras=(int) Math.pow(10,digitos);
      return Math.rint(numero*cifras)/cifras;
}

Vieron lo facil que es mejorar el metodo. Espero que este metodo estee en su clase Utiles ya que siempre es necesario para facilitarnos las cosas.

P.D: Nada te cuesta dejar un comentario o agradecer. y si quieres copiar el codigo solo posiciona el cursor sobre el codigo y da clic en el icono con las 2 hojas que aparece en la parte superior derecha del codigo.

Tux Matemático
Tux Matemático

[ACTUALIZACIÓN 07/04/2011]

Despues de revisar que existia un error en algunos redondeos, he encontrado la forma de realizar el redondeo exacto, esta vez sin errores. Para esto usaremos la clase BigDecimal y usaremos sus metodos.


public static void main(String[] args)
{
      double valor = 1254.625;
      String val = valor+"";
      BigDecimal big = new BigDecimal(val);
      big = big.setScale(2, RoundingMode.HALF_UP);
      System.out.println("Número : "+big);
}

Lo que hacemos aqui es teniendo un numero double lo insertamos en un String, luego utilizando el constructor de BigDecimal creamos un numero BigDecimal. Ahora para poder redondear hacia arriba (si es .536 y queremos 2 cifras de redondero mostrará .54)  utilizamos el método setScale y le pasamos como parametros el numero de decimales que queremos redondear y el RoundingMode.HALF_UP que es para redondear hacia arriba. Para volver a obtener el valor double simplemente podemos usar el metodo big.doubleValue().

Espero les sirva con esta solución.

comentarios
  1. dcarhuancho dice:

    Veo que este es el post que mas visitas tienen, espero el metodo les haya servido. Saludos y djen sus comentarios, sugerencias, etc.

    • Andrea dice:

      Muy pero muy BUENO, que digo BUENO, BUENISIMO!!!! Me re sirvio gracias, muchas gracias

    • atx dice:

      Sin duda BUENO!! Como bien dices, después de darme unas vueltecillas por internet y comprobar que a mi no me funciona nada, me he encontrado con este gran aporte. Gracias compañero!!

  2. Luis dice:

    Muchas gracias, estaba buscando algo como esto para una simulación que debo hacer

  3. TENGOLOSHUEVOSLLENOSDESPAM dice:

    hago mi aporte un round de BigD

    public static BigDecimal round(BigDecimal number,Integer digits){
    Integer cifras=(int) Math.pow(10,digits);
    Double numberD = new Double(number.toString());
    Double result = (Math.rint(numberD*cifras)/cifras);
    return new BigDecimal(result.toString());
    }

    saludos gente, y gracias por el aporte [ lo meti en un package commons 😉 ]

  4. Jaime dice:

    Excelente, Me Sacas De Un Apuro. Gracias.

  5. Ivan dice:

    Amigo no me funcionó le probé con el siguiente número 68.835 debió haberme dado 68.84 y el resultado que me dió fue 68.83

    Por favor sería bueno que le revises a la función.

  6. dcarhuancho dice:

    Es muy raro, para el resto de numeros no falla, alguien tiene alguna solucion? estoy probando con bastantes datos y no falla, solo el numero que menciona IVAN, seguire ervisando en busca de alguna solucion.

  7. Emanuel dice:

    Gracias me ayudo mucho!!

  8. albeirs dice:

    Te felicito
    Es un buen aporte para los que estamos empezando

  9. rafael dice:

    muchas gracias…

  10. Fran dice:

    Gracias.

    Buen trabajo, me has ahorrado algunos minutos.

  11. arsalfito dice:

    Que belleza de método. Muchas gracias. Saludos

  12. Andres dice:

    GRACIAS me ha servido perfectamente.

  13. Brancia dice:

    Muy bueno el método que creaste, me ha sido de gran utilidad para mi proyecto, ya que antes me complicaba usando la clase DecimalFormat.
    Saludos

  14. Silvano dice:

    Es lo que mejor he encontrado, gracias

  15. Gary dice:

    bue post—- estuvo buenoo

  16. Mayra Zelada dice:

    Davis! Buen blog!..no lo habia visto =)

    SI ps hay un problemita con el Rint cuando redondea con el .XXX5 porque lo acerca al anterior entero :S

  17. André dice:

    Muchas gracias! Ya lo había usado alguna vez de esta misma página, pero ahora lo vuelvo a necesitar y deseo agradecerte! salu2!

  18. agles dice:

    plenazo !! algo simple pero muy util… justo lo que buscaba 😀 gracias

  19. tnricardo dice:

    Muchas gracias… es sencilla y practica

  20. Aprendiz dice:

    porque no redondea este numero 0.44999999 ???

  21. Nixon dice:

    Buena tarde.
    Compañeros ojala me puedan sacar de esta apuro que tengo con java…..

    El problema es el siguiente: tengo un String a = «00014659676.95»
    Lo que necesito hacer es convertir este String a un double, lo hago y lo muestra por pantalla asi: 1.465967695E7 esto segun lo que he leido se debe a que double solo soporta 16 bits. Y si lo tomo como int no me deja por los puntos decimales.
    En fin lo que quiero es que este dato me lo mustre exactamente igual para poder hacer operaciones matematicas con el.

    Ojala me puedan ayudar, se los agradeceria demasido.
    Quedo atento a sus comentarios o sugerencias.

    Gracias.

  22. Erinson dice:

    Gracias me funciono bien, Estoy aprendiendo Java y keria redondear un determinado numero de decimales.. gracias

  23. Javera dice:

    Muchisimas Gracias dcarhuancho!!! Me ha servido mucho tu metodo…

  24. jenniffer dice:

    no inventes gracias por esa ayuda eh la verdad me hizo un gran favor yam staba doliendo la kbza pro no m kic rendir y al final que encuentro esto esta super no abandones esto jeje gracias

  25. chato dice:

    Muchas gracias, me ha sido útil en un proyecto para la escuela.

    Saludos.

  26. Andres dice:

    Gracias justo lo que buscaba!

  27. ronnie samuel dice:

    Muchas gracias amigo, me sirvio de mucho para redondear precios… Saludos desde Queretaro, Mexico.

  28. Ronny dice:

    Hola a todos, desarrollo una aplicación comercial, yo hice el mismo método con una variación, que reciba algún dato de tipo entero, float, String, double asi:

    public static double redondear(Object num,int decimales)
    {
    double numero=Double.parseDouble(num.toString());
    int aux=(int)Math.pow(10, decimales);
    return Math.rint(numero*aux)/aux;
    }

    quiero comentarles de que el método para redondear tiene un defecto.
    Si quiero redondear el valor 17.236, asi: redondear(2.1168 , 2)
    me devuelve un valor asi:
    2.119999999999999
    cuando quiero que me de:
    2.12
    Esto se da debido a la división que se hace , digamos que eso pasa en otros lenguajes de programación también, es porque el microprocesador al hacer una división, da ese defecto.

    no me importa si tiene un error tan pequeño, el punto es que cuando quiero guardar en una base de datos solo se toma los dos decimales, se tomará 2.11, cuando quiero que se tome 2.12

    ¿Alguna solución?

  29. Juan Arboleda dice:

    Yo utilizo un método más simple:

    Double a = 15.1678
    String redondeo=String.format(«%.2f»,a)

    Esto me devuelve un string con redondeo a 2 decimales. En este caso me devuelve: 15.17
    Si desean más decimales sólo cambian el 2 de la parte: «%.2f» por el número de decimales que requieran.
    Además, para sistemas de 64 bits cambiar la «f» después del 2 por la «d»

  30. nicky dice:

    thanx man, me ha servido de mucho

  31. Jean dice:

    muy bueno el post…me ayudo un monton

  32. Andrea dice:

    muy bueno esto, me re sirvio

  33. elias dice:

    tengo el mismo problema que ivan
    con este numero 446.405 si no me equivoco deberia redondear a 446.41 o estoy en un error???
    las 2 funciones redondean despues del .6 y no del .5 que es como lo necesito..
    si estoy en un error corrijanme por favor..

  34. elvenbyte dice:

    Gracias, me sirvió.

  35. Yoelkis dice:

    Hermanos esta muy bueno este sitio explica bien y sin muchas complicaciones muchísimas gracias

  36. excelente. gracias..copiado a la java util

  37. David dice:

    Excelente me sirvió de mucho. Gracias.

  38. Alejandro CR dice:

    buenos aportes
    grasias…. pero una pregunta, si en lugar de redondear 2.4567 a 2.46.
    deseo redondear o mas bien agregar otro cero al 1.0, o sea 1.00. como le aría.
    utilizaria las mismas funciones?.

  39. Micky dice:

    Muchas gracias x el dato, saludos

  40. CarMa dice:

    Excelente tutorial. Funciona al 100%.
    Gracias por el Aporte.

  41. Oliver dice:

    Buenisimo eso andaba buscando

  42. Gustavo dice:

    Esta muy bueno el post me sirvio mucho esta tecnica para redondear gracias!!!!!

  43. goria dice:

    Gracias por el aporte

    Añado mismo método con respuesta en una sola línea


    private double redondear(double numero, int digitos) {
    return new BigDecimal(String.valueOf(numero)).setScale(digitos,RoundingMode.HALF_UP).doubleValue();
    }

    Saludos cordiales

  44. Gracias por el artículo y aunque no lo probé aun ya lo voy a hacer a mi tambien me gusta aportar pero parece que la pagina de forums de java ya no funciona como antes , no se donde publicar
    Saludos
    Miguel

  45. Bueno ya lo probe funciona bien redondea hacia el valor superior o inferior del ultimo decimal .
    Gracias
    Miguel

  46. Joselo dice:

    gracias carnal, esta chevere

  47. Francisco dice:

    muchas gracias, me sirvio demaciado 😀

  48. Aldo Cortés dice:

    Me funcionó perfectamente, muchas gracias.
    Saludos.

  49. El padrino dice:

    Pinches Ners

  50. Vivi dice:

    very good!!!
    🙂

  51. el musulman dice:

    pinches ners

  52. el musulman dice:

    pinches ners masturbados

  53. Muy buen aporte doc!!! Uno muchas veces x desconocer se recurre a rehacer cosas sin saber q ya existian.. muy bueno!!!! (Y). Gracias x el aporte!!!

  54. PonchO dice:

    Muchas Gracias Me servio mucho 😀

  55. Manuel Óscar dice:

    Muchas gracias. Funciona perfectamente.

  56. Randalf dice:

    Muy bueno, muchas gracias me ha sido de gran ayuda!!!

  57. grecia dice:

    muy buena la explicacion gracias..!!!!

  58. victor dice:

    Excelente, mis metodos de redondeo fallaban y me causaban problema 😦 (Y)

  59. aj dice:

    Gracias no sabia de BigDecimal

  60. marsanga dice:

    Probar esto a ver

    double num=3.125;

    //esta forma es para pasar a bigdecimal
    BigDecimal b = new BigDecimal(num);
    b = b.setScale(2, RoundingMode.HALF_UP);
    System.out.println(b);
    // b.doubleValue(); devuelve a su estado anterior

    //esta forma es para el print
    DecimalFormat c=new DecimalFormat(«##.00»);
    System.out.println( c.format(num));

  61. Noemi dice:

    Gracias eres un pan!

  62. Anónimo dice:

    Que sepais que esta función cuando la parte decimal es un 5, redondea al entero más cercano PAR, de modo que Math.rint(1.5d) = 2d y Math.rint(2.5d) = 2.

    Os recomiendo que os paséis a Math.round si esto os supone un problema.

  63. rafaelbecks dice:

    Excelente, muy útil. Pásate por algunas entradas de mi blog http://epilepsiaradiactiva.wordpress.com/2012/10/09/aprendiendo-java-gui-para-el-script-youtube-dl/ y gracias por cierto..

  64. Rene dice:

    huy gracias me ayudo este método para no estar creándome otro mas largo huy gracias!!!

  65. Muchas gracias por la ayuda, me sirvió un montón.

  66. Gracias, este método es como un truco bajo la manga pero es muy útil.

  67. The dice:

    Muchas gracias tío! me ha servido! 🙂

  68. Bryan Horna dice:

    Gracias por el aporte.
    Ahora, ¿Cómo puedo pasar un float como parámetro? Es decir, en mi programa no necesito doubles. ¿Es necesario hacer casting de variables? Si es así, ¿cómo?
    Tengo lo siguiente:
    M = C * (N * T + 1);
    Y deseo redondearlo a dos decimales, como lo explicas en el post.
    Espero me puedas ayudar.

  69. […] Reference link: https://javafox.wordpress.com/2009/10/20/redondear-un-double-en-java/ […]

  70. Graciaaaas por el PEDAZOO de codigo :DDDDD !!

  71. Martín dice:

    Gracias. Me apunto tu blog.

  72. Felipe_ dice:

    Gracias por el apoyo… Funciona al 100.0000 xD

  73. Alba Diaz dice:

    Gracias! Me ha servido de mucho…. Un saludo!!

  74. Seligrat dice:

    Aquí dejo un método matemático para redondear
    public double round(double input, int digit){
    double out = Double.NaN;
    double rounder = Double.NaN;
    int decimal = digit + 1;
    decimal = (int) Math.pow(10, decimal);
    digit = (int) Math.pow(10, digit);

    rounder = Math.rint(input*decimal);
    System.out.println(rounder);
    out = Math.rint(input*digit)*10;
    System.out.println(out);

    if((rounder – out) >= 5){
    out = out + 10;
    }
    out = out/decimal;
    return out;
    }

  75. Kike dice:

    Este también tiene problemas que no no hay una que sirva realmente para rendondear y que sea fiable…
    BigDecimal big = new BigDecimal(7.515);
    System.out.println(big.setScale(2, RoundingMode.HALF_UP));

  76. Boris dice:

    Saudos compadre, una simple duda, por qué la expresión a/b siempre me devuelve 0.0 cuanod b>a…Gracias de antemano

  77. Joha dice:

    Muy buenísima la info.! me funciono perfectamente. Gracias!!

  78. Byron dice:

    buen aporte Inge.. felicidades

Replica a Ronny Cancelar la respuesta