Redondear un doble para convertirlo en un int (java)

119

Ahora mismo estoy intentando esto:

int a = round(n);

dónde n hay un doublepero no funciona. ¿Qué estoy haciendo mal?

David
fuente
posible duplicado de stackoverflow.com/questions/153724/…
Matt Ball
6
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.

Entonces, tendrás que emitir el valor de retorno:

int a = (int) Math.round(doubleVar);
Mihir Mathuria
fuente
1
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:

int a = (int) (doubleVar + 0.5);
Dr. Daniel Thommes
fuente
4
Claramente no hay una razón valiosa para que no me guste Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio
3
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

private int 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.

Valerybodak
fuente
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.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double 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 = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}
Scott
fuente
3

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.

Divyansh Rai
fuente
1

Documentación de Math.rounddice:

Devuelve el resultado de redondear el argumento a un número entero . El resultado es equivalente a (int) Math.floor(f+0.5).

No es necesario lanzar a int. Tal vez fue cambiado del pasado.

matón-jugador
fuente
4
Hay 2 métodos Math.round. El que toma un flotador devuelve un número entero, eso es correcto. Pero el que lleva un doble devuelve un largo.
Dominik Ehrenberg
0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
Alexander Cyberman
fuente
-1

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.

Joey Gibson
fuente
No hay funciones globales en java, para empezar.
Danon