Java: doble a la conversión del tipo de flotador está dando 'infinito' para valores mayores

Dios mensual

Supongamos que si i tiene una variable con algunos valores aleatorios más grandes de tipo dobles:

double d = 4786777867867868654674678346734763478673478654478967.77;

Ahora si trato de convertir esto en flotador en algún momento de mi programa, la salida da 'infinito' (en Eclipse IDE):

float f = (float)d;    // inifinty
byte b = (byte)d;      // some valid value
short s = (short)d;    // some valid value
int i = (int)d;        // some valid value

Alguien me puede dar alguna respuesta válidos, cómo no es la conversión de tipo de datos sólo para la flotación?

SirRaffleBuffle:

Vamos a echar un vistazo al resultado de lanzar este gran doublea cada uno de los otros tipos primitivos numéricos:

    double d = 4786777867867868654674678346734763478673478654478967.77;
    System.out.printf("float  %f\n", (float)d);
    System.out.printf("long   %d\n", (long)d);
    System.out.printf("int    %d\n", (int)d);
    System.out.printf("short  %d\n", (short)d);
    System.out.printf("byte   %d\n", (byte)d);

Salida:

float Infinity
long  9223372036854775807
int   2147483647
short -1
byte  -1

Flotador

A partir de los JLS :

Una conversión primitiva estrechamiento de doble a flotador se rige por las reglas de redondeo IEEE 754 (§4.2.4). Esta conversión puede perder precisión, sino también gama perder, lo que resulta en un flotador cero desde un distinto de cero doble y una infinidad de flotación de una doble finita .

Básicamente, IEEE 754 mandatos este comportamiento. IEEE 754 reserva un patrón de bits específica para representar el infinito, y todas las operaciones de punto flotante que implican este valor se definen.

Long & Int

Los estados JLS que en el caso de una conversión primitiva estrechamiento de doublea longo int, donde el valor es demasiado grande para caber en el intervalo (64 o 32 bits entero con signo), el mayor valor representable debe ser utilizado, Long.MAX_VALUEy Integer.MAX_VALUE;

Corto y Byte

En echando una doublea una shorto byte, el número es primero fundido a una int, utilizando la regla anterior. Se echó a continuación, a partir de inta shorto bytedescartando todos, pero los nbits más bajos (16 a short, 8 para byte). Desde todos, pero el bit alto de Integer.MAX_VALUEse establece en 1, la shorty bytelos valores se han fijado todos los bits, que corresponde a -1 en firmado complemento a dos.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=184805&siteId=1
Recomendado
Clasificación