Realmente debería elaborar "no funciona" con más detalle. ¿Lo que pasa? ¿Qué pasa no? ¿Que esperabas? ¿Qué errores obtuviste? ¿Tienes un round()método en la misma clase? ¿Verdad import static java.lang.Math.*? Etc .. Hay muchas formas de redondear números y, por lo tanto, también muchas respuestas posibles. En otras palabras, su pregunta es vaga y ambigua y no puede responderse razonablemente en su forma actual. Está disparando en la oscuridad.
BalusC
1
¿"No funciona" significa no redondear al int más cercano, o lanzar una excepción, o no redondear hacia arriba / hacia abajo? Esta pregunta es inútil sin tener que hacer una referencia cruzada del contexto con la respuesta.
modulitos
Respuestas:
239
¿Cuál es el tipo de retorno del round()método en el fragmento?
Si este es el Math.round()método, devuelve Long cuando el parámetro de entrada es Double.
Considere usar Math.toIntExact (long) en lugar de simplemente convertir a un int; un doble puede contener un amplio rango de valores y probablemente no quieras descartar silenciosamente los bits más significativos si tu doble es más grande de lo que esperas.
othp
Creo que el yeso no es necesario. No sé si fue en el pasado, pero round devuelve int.
Abandono
@Dropout Math.round devuelve un int si le da un float, y un long si le da un doble.
Tur1ng
27
Si no le gusta Math.round (), también puede usar este enfoque simple:
Esta solución es más corta, no necesita importación y es portátil a muchos otros lenguajes de programación con cambios mínimos. Y podría ser incluso más rápido dependiendo de su plataforma: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes
1
No estoy criticando su respuesta, que me parece muy útil por la razón que menciona. Con este comentario, me estaba dirigiendo a personas que tendrían miedo de usar Math.round(), lo que hace "literalmente" lo mismo que la solución que usted proporciona, eso es todo. Salud.
Gauthier Boaglio
2
Sí, como dijo nehz, creo que esto redondearía -2,1 a -1, por ejemplo.
Ben Aaronson
5
@AlbertoHormazabal, ¿no te diste cuenta de que agregó 0.5?
Sasha
11
Redondear el doble al entero "más cercano" esta manera:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
privateint round(double d){double dAbs =Math.abs(d);int i =(int) dAbs;double result = dAbs -(double) i;if(result<0.5){return d<0?-i : i;}else{return d<0?-(i+1): i+1;}}
Puede cambiar la condición (resultado <0,5) como prefiera.
Estoy de acuerdo con la respuesta del anivaler. Pero si solo necesita redondear al número entero más alto, puede hacer lo siguiente: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Salida: 5
Smeet
3
import java.math.*;publicclassTestRound11{publicstaticvoid main(String args[]){double d =3.1537;BigDecimal bd =newBigDecimal(d);
bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);// output is 3.15System.out.println(d +" : "+ round(d,2));// output is 3.154System.out.println(d +" : "+ round(d,3));}publicstaticdouble round(double d,int decimalPlace){// see the Javadoc about why we use a String in the constructor// http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)BigDecimal bd =newBigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);return bd.doubleValue();}}
La función Math.round está sobrecargada. Cuando recibe un valor flotante, le dará un int. Por ejemplo, esto funcionaría.
int a=Math.round(1.7f);
Cuando recibe un valor doble, te dará un long, por lo que debes encasillarlo a int.
int a=(int)Math.round(1.7);
Esto se hace para evitar la pérdida de precisión. Su valor doble es 64 bits, pero luego su variable int solo puede almacenar 32 bits, por lo que simplemente lo convierte en largo, que es 64 bits, pero puede encasillarlo a 32 bits como se explicó anteriormente.
Realmente necesita publicar un ejemplo más completo, para que podamos ver lo que está tratando de hacer. Por lo que ha publicado, esto es lo que puedo ver. Primero, no hay un round()método incorporado . Necesita llamar Math.round(n), o importar estáticamente Math.round, y luego llamarlo como lo hizo.
round()
método en la misma clase? ¿Verdadimport static java.lang.Math.*
? Etc .. Hay muchas formas de redondear números y, por lo tanto, también muchas respuestas posibles. En otras palabras, su pregunta es vaga y ambigua y no puede responderse razonablemente en su forma actual. Está disparando en la oscuridad.Respuestas:
¿Cuál es el tipo de retorno del
round()
método en el fragmento?Si este es el
Math.round()
método, devuelve Long cuando el parámetro de entrada es Double.Entonces, tendrás que emitir el valor de retorno:
fuente
Si no le gusta Math.round (), también puede usar este enfoque simple:
fuente
Math.round()
: stackoverflow.com/a/6468757/1715716Math.round()
, lo que hace "literalmente" lo mismo que la solución que usted proporciona, eso es todo. Salud.0.5
?Redondear el doble al entero "más cercano" esta manera:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
Puede cambiar la condición (resultado <0,5) como prefiera.
fuente
fuente
La función Math.round está sobrecargada. Cuando recibe un valor flotante, le dará un int. Por ejemplo, esto funcionaría.
Cuando recibe un valor doble, te dará un long, por lo que debes encasillarlo a int.
Esto se hace para evitar la pérdida de precisión. Su valor doble es 64 bits, pero luego su variable int solo puede almacenar 32 bits, por lo que simplemente lo convierte en largo, que es 64 bits, pero puede encasillarlo a 32 bits como se explicó anteriormente.
fuente
Documentación de
Math.round
dice:No es necesario lanzar a
int
. Tal vez fue cambiado del pasado.fuente
fuente
Realmente necesita publicar un ejemplo más completo, para que podamos ver lo que está tratando de hacer. Por lo que ha publicado, esto es lo que puedo ver. Primero, no hay un
round()
método incorporado . Necesita llamarMath.round(n)
, o importar estáticamenteMath.round
, y luego llamarlo como lo hizo.fuente