2010-04-16 13 views
80

En este momento estoy tratando esto:Completando un doble para convertirlo en un int (Java)

int a = round(n); 

donde n es una double pero no está funcionando. ¿Qué estoy haciendo mal?

+0

posible duplicado de http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java –

+4

Realmente debería elaborar "no funciona" en más detalle. ¿Lo que pasa? ¿Qué pasa no? ¿Que esperabas? ¿Qué errores obtuviste? ¿Tienes un método 'round()' en la misma clase? ¿'Importó estática java.lang.Math. * 'Estática? 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 ser razonablemente respondida 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/abajo? Esta pregunta es inútil sin tener que hacer una referencia cruzada del contexto con la respuesta. – modulitos

Respuesta

181

¿Cuál es el tipo de devolución del método round() en el fragmento?

Si este es el método Math.round(), devuelve un Largo cuando el parámetro de entrada es Doble.

Por lo tanto, tendrá que emitir el valor de retorno:

int a = (int) Math.round(doubleVar); 
+0

Considere usar Math.toIntExact (long) en lugar de simplemente convertir a un int; un doble puede contener un amplio rango de valores y es probable que no desee descartar silenciosamente los bits más significativos si su doble es más grande de lo que esperaba. – othp

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(); 
    } 
} 
-1

Realmente necesita publicar un ejemplo más completo, para que podamos ver lo que está tratando de hacer. De lo que has publicado, esto es lo que puedo ver. Primero, no hay un método incorporado round(). Debe llamar al Math.round(n) o importar de manera estática Math.round, y luego llamarlo como lo hizo.

+0

No hay funciones globales en java, para empezar. – Danon

12

Completando doble a la "más cercano" número entero así:

1,4 ->

1,6 ->

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

+0

Estoy de acuerdo con la respuesta del anivaler. Pero si necesita redondear al número entero más alto, puede hacer clic abajo: double decimalNumber = 4.56777; System.out.println (nuevo Float (Math.round (decimalNumber))); Salida: 5 – Smeet

24

Si no te gusta Math.round() se puede utilizar este enfoque simple, así:

int a = (int) (doubleVar + 0.5); 
+1

Claramente no hay un motivo valioso para que no le guste 'Math.round()': http://stackoverflow.com/a/6468757/1715716 –

+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 incluso ser más rápido dependiendo de su plataforma: https://stackoverflow.com/questions/12091014/what-is-the-most-efficient-way-to-round-a-float-value-to-the -inferior-entero-en/12091343 # 12091343 –

+0

No estoy criticando su respuesta, que me parece ** muy útil ** por el motivo que usted menciona. A través de este comentario, me dirigí a personas que tendrían miedo de usar 'Math.round()', que hace "literalmente" lo mismo que la solución que usted proporciona, eso es todo. Aclamaciones. –

1

Documentación de Math.round dice:

Devuelve el resultado del redondeo el argumento de un entero. El resultado es equivalente a (int) Math.floor(f+0.5).

No hay necesidad de convertir a int. Tal vez fue cambiado desde el pasado.

+3

Hay 2 métodos Math.round. El que toma un flotador devuelve un entero, eso es correcto. Pero el que toma un doble devuelve un largo. –

0
public static int round(double d) { 
    if (d > 0) { 
     return (int) (d + 0.5); 
    } else { 
     return (int) (d - 0.5); 
    } 
} 
0

La función Math.round está sobrecargado Cuando se recibe un valor flotante, que le dará un int. Por ejemplo, esto funcionaría.

int a=Math.round(1.7f); 

Cuando se recibe un valor doble, que le dará una larga, por lo tanto, usted tiene que encasillado que a int.

int a=(int)Math.round(1.7); 

Esto se hace para evitar pérdida de precisión. Su valor doble es de 64 bits, pero luego su variable int solo puede almacenar 32 bits, por lo que solo la convierte en larga, que es de 64 bits, pero puede encasillarla en 32 bits como se explicó anteriormente.

Cuestiones relacionadas