2012-01-30 75 views
5

Me doy cuenta de que un número decimal solo puede almacenarse con tanta precisión como un float en un sistema binario, pero lo que no entiendo es lo que ocurre en el 7 decimal en mi salida de 10/7 .Cómo funcionan las tiendas java float v double

En mi primera prueba de salida noté que el 5 (7º lugar) al final del flotador v el 4 (7º lugar) seguido de un 2 en el doble. Yo creo que el séptimo lugar en el flotador sería un 4 ya que el octavo lugar en el doble es un 2.

flotador 1.4285715 doble 1,4285714285714286

entonces me encontré con la siguiente prueba de salida utilizando el formato flotante a 17 lugares. El octavo lugar en cada uno es diferente, el float es un 6, por lo que el 7º lugar se redondea a 5, supongo.

flotador 1.428571462631225600 doble 1.428571428571428600

En la tercera prueba de salida he intentado un reparto directo con el formato de cadena para ver lo que sucedería. Obtuve los mismos resultados que la segunda prueba.

Si tengo una pregunta simplista sobre un método complejo de almacenamiento en coma flotante, me disculpo.

float f = 10/7f; 
    double d = 10/7d; 

    System.out.format 
     ("Float %1s\nDouble %2s\n", f,d); 
    /* 
    * Float 1.4285715 
     Double 1.4285714285714286 
    */ 

    System.out.format 
     ("Float %1$.17f\nDouble %2$.17f\n", f,d); 
    /* 
    * Float 1.428571462631225600 
     Double 1.428571428571428600 
    */ 

    System.out.format 
     ("Float %1s\nDouble %2s\n", (double)f,d); 
    /* 
    * Float 1.4285714626312256 
     Double 1.4285714285714286 
    */ 
+6

¿Cuál es exactamente su pregunta? (No veo ningún signo de interrogación en su publicación ...) – maerics

+0

Así se almacena el doble: - http://en.wikipedia.org/wiki/Double-precision_floating-point_format –

Respuesta

1

Parece que cuando se utiliza un float se utiliza un valor predeterminado precisión de 8 dígitos para este número. Cuando especifica una precisión, deja en claro que en realidad usa double para calcular el valor.

6

En mi primera prueba de salida noté que el 5 (7º lugar) al final del flotador v el 4 (7º lugar) seguido de un 2 en el doble. Yo creo que el séptimo lugar en el flotador sería un 4 ya que el octavo lugar en el doble es un 2.

Esta expectativa sólo tiene sentido si se piensa que los flotadores se almacenan internamente en decimal y se redondean a un número de dígitos decimales Pero esto no es cierto, los flotantes se almacenan internamente en binario y se redondean a un número de dígitos binarios.

Sus expectativas se basan en un malentendido de cómo se almacenan los números de coma flotante. Verás que los dobles tienen lugares decimales más precisos solo porque esto es consecuencia de que tengan lugares binarios más precisos. La implementación no almacena los números en forma decimal en absoluto.

+0

Voto a favor por la explicación más precisa que explica _por qué esto sucede. –

Cuestiones relacionadas