Pregunta

Noté en otra publicación que alguien había hecho algo como:

double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));

¿Por qué usaron la función de conversión, en lugar de:

double d = 3.1415;
int i = (int)d;

que tiene un piso implícito y convierte.

Además, lo que es más preocupante, noté en algún código de producción que estaba leyendo:

double d = 3.1415;
float f = Convert.ToSingle(d);

¿Es lo mismo que:

float f = (float)d;

¿Todas esas conversiones implícitas están solo en la clase Convertir para que estén completas, o tienen un propósito?Puedo entender la necesidad de .ToString(), pero no el resto.

¿Fue útil?

Solución

La conversión a int es un truncamiento implícito, no un piso implícito:

double d = -3.14;
int i = (int)d;
// i == -3

Elijo Math.Floor o Math.Round para hacer mis intenciones más explícitas.

Otros consejos

El redondeo también se maneja de manera diferente:

x=-2.5 (int)x=-2 Convertir.ToInt32(x)=-2
x=-1.5 (int)x=-1 Convertir.ToInt32(x)=-2
x=-0.5 (int)x= 0 Convertir.ToInt32(x)= 0
x= 0.5 (int)x= 0 Convertir.ToInt32(x)= 0
x= 1.5 (int)x= 1 Convertir.ToInt32(x)= 2
x= 2.5 (int)x= 2 Convertir.ToInt32(x)= 2

Observe los casos x=-1,5 y x=1,5.
En algunos algoritmos, el método de redondeo utilizado es fundamental para obtener la respuesta correcta.

Puedes usar Convertir cuando tengas una cadena que quieras convertir a un int

int i = Convert.ToInt32("1234");

Tanto la conversión como la conversión generarán una excepción si fallan.

es decir, esto seguirá generando una excepción, no devolverá 0:

Convert.ToInt32("1234NonNumber");

En muchos casos, la conversión y la conversión tendrán el mismo resultado, pero una conversión suele ser más fácil de leer.

Convert.ToInt32() se usa en cadenas (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx) mientras que la conversión solo se puede utilizar en tipos que tienen convertidores internos (tipos numéricos).El verdadero truco consiste en decidir entre Int32.Parse y Convert.ToInt32().Convert.ToInt32() tolera un parámetro nulo y devuelve 0, mientras que Int32.Parse() arrojará una ArgumentNullException.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top