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.
[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.
Veo que este es el post que mas visitas tienen, espero el metodo les haya servido. Saludos y djen sus comentarios, sugerencias, etc.
Muy pero muy BUENO, que digo BUENO, BUENISIMO!!!! Me re sirvio gracias, muchas gracias
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!!
Muchas gracias, estaba buscando algo como esto para una simulación que debo hacer
De nada, el metodo si funciona 100% probado.
Saludos
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 😉 ]
el cifras.toString(); quitenlo no lo habia visto :p
salutes
Bueno tuaporte y comenten si el metodo les resulto. Saludos
Excelente, Me Sacas De Un Apuro. Gracias.
por nada, pronto mas novedades, ahora he estado full por eso que no puedo postear!
por nada, pronto mas novedades, ahora he estado full por eso que no puedo postear!
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.
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.
Gracias me ayudo mucho!!
Te felicito
Es un buen aporte para los que estamos empezando
muchas gracias…
Gracias.
Buen trabajo, me has ahorrado algunos minutos.
Que belleza de método. Muchas gracias. Saludos
Gracias, voy a revisar el metodo parece que ha tenido problemas. Saludos
GRACIAS me ha servido perfectamente.
Por nada, ahora que tenga mas tiempo seguire con mas post.
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
Es lo que mejor he encontrado, gracias
bue post—- estuvo buenoo
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
Si, pero el problema ya tiene solucion, mañana actualizo el post para tener la solucion definitiva.
Saludos
Muchas gracias! Ya lo había usado alguna vez de esta misma página, pero ahora lo vuelvo a necesitar y deseo agradecerte! salu2!
plenazo !! algo simple pero muy util… justo lo que buscaba 😀 gracias
Muchas gracias… es sencilla y practica
porque no redondea este numero 0.44999999 ???
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.
Gracias me funciono bien, Estoy aprendiendo Java y keria redondear un determinado numero de decimales.. gracias
Muchisimas Gracias dcarhuancho!!! Me ha servido mucho tu metodo…
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
Muchas gracias, me ha sido útil en un proyecto para la escuela.
Saludos.
No tienes por que.
Gracias justo lo que buscaba!
Muchas gracias amigo, me sirvio de mucho para redondear precios… Saludos desde Queretaro, Mexico.
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?
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»
Saludos Juan.
Y con una variable de tipo float como se haría porque probé este método y no funcionó.
Gracias por tu ayuda.
thanx man, me ha servido de mucho
muy bueno el post…me ayudo un monton
muy bueno esto, me re sirvio
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..
Gracias, me sirvió.
Hermanos esta muy bueno este sitio explica bien y sin muchas complicaciones muchísimas gracias
excelente. gracias..copiado a la java util
Excelente me sirvió de mucho. Gracias.
gracias!!
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?.
Muchas gracias x el dato, saludos
Excelente tutorial. Funciona al 100%.
Gracias por el Aporte.
Buenisimo eso andaba buscando
Esta muy bueno el post me sirvio mucho esta tecnica para redondear gracias!!!!!
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
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
Bueno ya lo probe funciona bien redondea hacia el valor superior o inferior del ultimo decimal .
Gracias
Miguel
gracias carnal, esta chevere
muchas gracias, me sirvio demaciado 😀
Me funcionó perfectamente, muchas gracias.
Saludos.
Pinches Ners
very good!!!
🙂
pinches ners
pinches ners masturbados
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!!!
Muchas Gracias Me servio mucho 😀
Muchas gracias. Funciona perfectamente.
Muy bueno, muchas gracias me ha sido de gran ayuda!!!
muy buena la explicacion gracias..!!!!
Excelente, mis metodos de redondeo fallaban y me causaban problema 😦 (Y)
Gracias no sabia de BigDecimal
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));
Gracias eres un pan!
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.
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..
huy gracias me ayudo este método para no estar creándome otro mas largo huy gracias!!!
Muchas gracias por la ayuda, me sirvió un montón.
Gracias, este método es como un truco bajo la manga pero es muy útil.
Muchas gracias tío! me ha servido! 🙂
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.
[…] Reference link: https://javafox.wordpress.com/2009/10/20/redondear-un-double-en-java/ […]
Graciaaaas por el PEDAZOO de codigo :DDDDD !!
Gracias. Me apunto tu blog.
Gracias por el apoyo… Funciona al 100.0000 xD
Gracias! Me ha servido de mucho…. Un saludo!!
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;
}
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));
Saudos compadre, una simple duda, por qué la expresión a/b siempre me devuelve 0.0 cuanod b>a…Gracias de antemano
Muy buenísima la info.! me funciono perfectamente. Gracias!!
buen aporte Inge.. felicidades
De nada