En nuestro código tenemos un doble que necesitamos convertir en un int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
¿Alguien puede explicarme por qué i1 != i2
?
El resultado que obtengo es que: i1 = 9
y i2 = 8
.
En nuestro código tenemos un doble que necesitamos convertir en un int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
¿Alguien puede explicarme por qué i1 != i2
?
El resultado que obtengo es que: i1 = 9
y i2 = 8
.
Respuestas:
Porque Convert.ToInt32
rondas:
Valor de retorno: redondeado al entero de 32 bits con signo más cercano. Si el valor está a medio camino entre dos números enteros, se devuelve el número par; es decir, 4.5 se convierte en 4 y 5.5 se convierte en 6.
... mientras el elenco se trunca :
Cuando se convierte de un valor doble o flotante a un tipo integral, el valor se trunca.
Actualización: consulte el comentario de Jeppe Stig Nielsen a continuación para ver diferencias adicionales (que, sin embargo, no entran en juego si score
es un número real como es el caso aquí).
score
fuera en 8.5
lugar de 8.6
. Actualicé la respuesta para incluir las citas. Gracias por el aporte.
score
es NaN
o un infinito o finito pero fuera del rango de Int32
, Convert.ToInt32
lanzará una excepción. Cast devolverá un int
, pero no sabrás cuál (en mi implementación es Int32.MinValue
) porque estás en unchecked
contexto. (Si está en checked
contexto, el elenco también lanzará una excepción en estos casos).
Double
número de tipo 10000000000.6
(diez mil millones punto seis) es un número "real". Usar un yeso int
en eso dará un resultado extraño (a menos que esté en checked
contexto, pero probablemente no lo esté).
La transmisión ignorará cualquier cosa después del punto decimal, por lo que 8.6 se convierte en 8.
Convert.ToInt32(8.6)
es la forma segura de asegurarse de que su doble se redondee al número entero más cercano, en este caso 9.
En el ejemplo proporcionado, su decimal es 8,6 . Si hubiera sido 8.5 o 9.5, la declaración i1 == i2 podría haber sido cierta. De hecho, habría sido cierto para 8.5 y falso para 9.5.
Explicación:
Independientemente de la parte decimal, la segunda declaración int i2 = (int)score
descartará la parte decimal y simplemente le devolverá la parte entera. Algo bastante peligroso de hacer, ya que podría producirse una pérdida de datos.
Ahora, para la primera declaración, pueden suceder dos cosas. Si la parte decimal es 5, es decir, está a la mitad, se debe tomar una decisión. ¿Redondeamos hacia arriba o hacia abajo? En C #, la clase Convert implementa el redondeo bancario. Consulte esta respuesta para obtener una explicación más profunda. En pocas palabras, si el número es par, redondee hacia abajo, si el número es impar, redondee hacia arriba.
Por ejemplo, considere:
double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score; // 8
score += 1;
i1 = Convert.ToInt32(score); // 10
i2 = (int)score; // 9
ToInt32 rondas. La conversión a int simplemente descarta el componente no entero.
Math.Truncate(score)
es una intención más explícitamente expresa que(int)score