Respuesta diferente al convertir un Double a un Int - Java vs .Net
Pregunta
En C # si quiero convertir un doble (1.71472) en un int, obtengo la respuesta 2. Si hago esto en Java usando el método intValue (), obtengo 1 como respuesta.
¿Java reduce las conversiones?
¿Por qué los documentos API de Java tienen información tan escasa sobre sus clases, es decir?
Devuelve el valor del especificado número como int. Esto puede involucrar redondeo o truncamiento.
¡Un poco más de información sobre el redondeo hubiera sido útil!
Solución
Java se redondea hacia cero cuando se estrecha desde un punto flotante a un tipo entero, y también lo hace C #, cuando utiliza la conversión de conversión. Es Convert.ToInt32
que redondea:
double d = 1.71472;
int x = (int) d; // x = 1
int y = Convert.ToInt32(d); // y = 2
Los detalles se pueden encontrar en la Especificación del lenguaje Java . Tenga en cuenta que, si bien la documentación citada en Number
deja las opciones abiertas para las subclases, la documentación sobre los tipos de boxeo concreto, como Double
, es explícito acerca de la implementación:
Devuelve el valor de este Doble como un int (enviando para escribir int).
Cuando se usa BigDecimal
, puede especificar una de las ocho políticas de redondeo diferentes.
Otros consejos
Java se redondea hacia cero cuando se estrecha desde un punto flotante a un tipo entero.
Hay más documentación sobre las reglas generales en el Lenguaje Java Especificación . Tenga en cuenta que si bien la documentación en Number
deja las opciones abiertas para las subclases, la documentación sobre los tipos de boxeo concreto es más explícita:
Devuelve el valor de este Doble como un int (enviando para escribir int).
Cuando se usa BigDecimal , puede especificar una de las ocho políticas de redondeo diferentes.
Jon Skeet es correcto, pero algo más a tener en cuenta es que .NET usa Redondeo bancario como su algoritmo de redondeo. Cuando estás a medio camino entre la ronda y el entero par.