round part parse java casting primitive mantissa

part - round double to int java



¿Cómo funciona double to int cast en Java? (3)

Es posible que desee leer la especificación de Java:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

La sección relevante es 5.1.3 - "Reducción de la conversión primitiva".

Soy nuevo en Java y me pregunto cómo funciona double to int cast? Entiendo que es simple por mucho tiempo tomar los 32 bits bajos, pero ¿qué hay del doble (64 bits) al int (32 bits)? esos 64 bits del doble en binario están en formato de coma flotante de precisión doble (Mantissa), entonces, ¿cómo se convierte a int internamente?


Java trunca su valor si usa (int) cast, como puede notar:

double d = 2.4d; int i = (int) d; System.out.println(i); d = 2.6; i = (int) d; System.out.println(i);

Salida:

2 2

A menos que uses Math.round, Math.ceil, Math.floor ...


Todo está documentado en la sección 5.1.3 de la JLS.

En el primer paso, el número de punto flotante se convierte a largo, si T es largo, o a int, si T es byte, short, char o int, de la siguiente manera:

Si el número de punto flotante es NaN (§4.2.3), el resultado del primer paso de la conversión es un int o un 0 largo.

  • De lo contrario, si el número de punto flotante no es infinito, el valor de punto flotante se redondea a un valor entero V, redondeando hacia cero usando el modo de redondeo hacia cero IEEE 754 (§4.2.3). Luego hay dos casos:

    • Si T es largo, y este valor entero puede representarse como un largo, entonces el resultado del primer paso es el valor largo V.

    • De lo contrario, si este valor entero se puede representar como un int, entonces el resultado del primer paso es el valor int V.

  • De lo contrario, uno de los dos casos siguientes debe ser verdadero:

    • El valor debe ser demasiado pequeño (un valor negativo de magnitud grande o infinito negativo), y el resultado del primer paso es el valor representable más pequeño del tipo int o long.

    • El valor debe ser demasiado grande (un valor positivo de gran magnitud o infinito positivo), y el resultado del primer paso es el mayor valor representable del tipo int o long.

(El segundo paso aquí es irrelevante, cuando T es int .)

En la mayoría de los casos, espero que esto se implemente mediante el soporte de hardware: la conversión de números de punto flotante en enteros es algo que generalmente es manejado por las CPU.