2012-02-17 16 views
13

Será un doble igual a un entero siempre emitido a ese entero (suponiendo que el doble no es uno que causa un desbordamiento). Ejemplo: Math.ceil() devolverá un doble que es igual a un número entero. Suponiendo que no hay desbordamiento, ¿siempre se convertirá en el mismo número entero al que supuestamente equivale?¿Un doble igual a un entero siempre se lanzará a ese número entero?

Si no, ¿cómo puedo redondear un double a un int o long?

+0

+1: pregunta interesante. Asumiría que la respuesta es "sí", pero puede haber algunos casos extremos que no he considerado. –

Respuesta

9

Desde tipos de Java son fijos y Java doubles have a 52 bit mantissa, pueden (con facilidad) representan un int Java de 32 bits sin redondeo.

+4

La mantisa representa 53 -bits como el bit superior implica que es 1. –

1

Creo que sí, pero es posible que probarlo tú mismo:

public static void main(String... args) throws Exception { 
    int interactions = Integer.MAX_VALUE; 
    int i = Integer.MIN_VALUE; 
    double d = Integer.MIN_VALUE; 
    long init = System.currentTimeMillis(); 
    for (; i < interactions; i++, d++) 
     if (!(i == (int) Math.ceil(d))) 
      throw new Exception("something went wrong with i=" + i + " and d=" + d + ", Math.ceil(d)="+Math.ceil(d)); 

    System.out.println("Finished in: "+(System.currentTimeMillis() - init)+"ms"); 
} 
+0

Estoy bastante seguro de que si lo hace lo suficiente, su error de redondeo causará un problema. (es decir, como 0.1 no se puede representar exactamente) –

+0

-1 utilizando pruebas empíricas para tales iteraciones es malo, ya que en la mayoría de los casos arrojará conclusiones erróneas. –

1

Todos los posibles int valores pueden ser representados por un doble sin error. La forma más sencilla de redondear es usar Math.ceil() p. Ej.

double d = 
long l = (long) Math.ceil(d); // note: could overflow. 
+3

Todos los valores 'int' pueden, pero no todos los valores' largos'. –

1

Empíricamente, la respuesta parece ser afirmativa - Obsérvese que también trabaja con i2 = (int) d;.

public static void main(String[] args) { 
    for (int i = Integer.MIN_VALUE + 1; i < Integer.MAX_VALUE; i++) { 
     double d = i; 
     int i2 = (int) Math.ceil(d); 
     if (i != i2) { 
      System.out.println("i=" + i + " and i2=" + i2); //Never executed 
     } 
    } 
} 
+0

También debe probar los números negativos, pero también funcionan. –

+0

modificado para comenzar desde Integer.MIN_VALUE – assylias

+0

-1 utilizando pruebas empíricas para tales iteraciones es malo, ya que en la mayoría de los casos arrojará conclusiones erróneas. –

6

Sí, convertirá exactamente. Esto se describe en Section 5.1.3 del JLS, que menciona

De lo contrario, si el número de coma flotante no es un infinito, el valor de punto flotante se redondea a un valor entero V, redondeo hacia cero usando IEEE 754 ida y hacia el modo de cero ...

Desde su double es exactamente igual al int, el valor "redondeada" es el mismo valor exacto, pero se puede leer la especificación para más detalles.

Cuestiones relacionadas