C# es un lenguaje estáticamente tipado. Esto significa que, si declaras una variable como int, el compilador no te dejará meterle un string o un bool “porque sí”.
Sin embargo, a veces necesitamos mover datos de un tipo a otro. Tal vez tienes un int y necesitas usarlo en una operación matemática que requiere double. O tienes un double y necesitas guardarlo en un campo que solo acepta int.
Aquí entran en juego las conversiones numéricas. C# ofrece dos tipos principales de conversiones numéricas:
- Conversiones implícitas: Estas conversiones no requieren una notación especial y son seguras, ya que no provocan pérdida de datos.
- Conversiones explícitas (casting): Estas conversiones requieren el uso de un operador de conversión y pueden llevar a pérdida de datos si no se manejan con cuidado.
Conversiones implícitas (Widening)
Las conversiones implícitas son aquellas que el compilador de C# realiza automáticamente. No necesitas escribir ningún código especial.
¿Por qué ocurren? Porque son conversiones seguras.
La regla general es la del “Ensanchamiento” (Widening): Si intentas guardar un valor pequeño en un contenedor grande, no hay riesgo de que se derrame nada. No hay pérdida de información.
int numeroPequeno = 1234;
long numeroGrande = numeroPequeno; // Conversión Implícita: OK
float altura = 1.75f;
double alturaPrecisa = altura; // Conversión Implícita: OK
En estos casos:
- Un
int(32 bits) cabe perfectamente en unlong(64 bits). - Un
float(menor precisión) cabe en undouble(mayor precisión).
Conversiones explícitas (Casting)
Las conversiones explícitas son aquellas donde nosotros forzamos al compilador a realizar la conversión, aunque exista riesgo. Esto se conoce comúnmente como Casting.
Esto ocurre en operaciones de “Estrechamiento” (Narrowing): intentar meter un valor de un contenedor grande en uno pequeño.
Para realizar un cast, colocamos el tipo de destino entre paréntesis (tipo) delante de la variable.
double precioExacto = 99.99;
int precioEntero = (int)precioExacto; // Casting Explícito
Console.WriteLine(precioEntero); // Imprime: 99
Al hacer casting de un decimal (double, float, decimal) a un entero, C# TRUNCA el número. No redondea al más cercano. Simplemente elimina todo lo que haya después de la coma.
Tabla de conversiones numéricas
Para tenerlo claro visualmente, aquí tenéis una tabla simplificada de qué conversiones son implícitas. Si no está en la lista, asumid que necesitáis un Cast explícito.
| Desde | Se convierte implícitamente a |
|---|---|
sbyte | short, int, long, float, double, decimal |
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double, decimal |
int | long, float, double, decimal |
long | float, double, decimal |
float | double |
Fijaos que no existen conversiones implícitas hacia char, byte o short desde otros tipos numéricos (salvo literales constantes pequeños). Siempre requieren casting.
Conversión usando métodos de la clase Convert
C# incluye la clase Convert, que proporciona métodos estáticos para realizar conversiones entre tipos de datos.
double valorDouble = 150.75;
int valorInt = Convert.ToInt32(valorDouble); // Redondea automáticamente el valor
El método Convert.ToInt32() redondea el valor de valorDouble en lugar de truncarlo, lo cual puede ser útil en aplicaciones donde se requiere precisión.
Algunos métodos de conversión comunes incluyen:
Convert.ToDouble()Convert.ToInt32()Convert.ToDecimal()
Convert realiza un redondeo, y además maneja los valores null devolviendo 0 (en lugar de explotar), lo cual es muy útil cuando trabajamos con datos que vienen de bases de datos o formularios web.
Conversión numéricas de cadenas de texto
Para muchas aplicaciones, necesitamos convertir valores numéricos a texto para mostrarlos en una interfaz de usuario, o convertir texto a valores numéricos a partir de una entrada del usuario.
En C#, esto se hace principalmente con los métodos ToString(), Parse() y TryParse().
Convertir de número a cadena
El método ToString() convierte un número a una cadena. Podemos especificar formatos para representar el número según nuestras necesidades:
double valorDouble = 12345.6789;
string texto = valorDouble.ToString("F2"); // Convierte a "12345.68" con dos decimales
Convertir de cadena a número
Para convertir una cadena de texto a un número, usamos Parse() o TryParse():
Convierte una cadena a un tipo numérico, pero lanza una excepción si la conversión falla.
string texto = "123.45";
double valorDouble = double.Parse(texto);
Similar a Parse, pero en lugar de lanzar una excepción, devuelve false si la conversión no es posible, evitando errores en tiempo de ejecución.
string texto = "123.45";
if (double.TryParse(texto, out double valorDouble))
{
Console.WriteLine($"Conversión exitosa: {valorDouble}");
}
else
{
Console.WriteLine("Error en la conversión");
}
TryParse es preferible cuando la entrada puede no ser numérica, ya que permite un control de errores más seguro.
Ejemplo prácticos
Conversión de unidades
Para ilustrar la conversión numérica en C#, desarrollaremos un programa que convierta kilómetros a millas. Esto implica convertir entre tipos de datos para asegurar que los cálculos sean precisos y manejados correctamente.
using System;
public class ConversorUnidades
{
public static void Main()
{
Console.Write("Ingrese la distancia en kilómetros: ");
string entrada = Console.ReadLine();
if (double.TryParse(entrada, out double kilometros))
{
double millas = ConvertirKilometrosAMillas(kilometros);
Console.WriteLine($"{kilometros} kilómetros equivalen a {millas:F2} millas.");
}
else
{
Console.WriteLine("Por favor ingrese un valor numérico válido.");
}
}
public static double ConvertirKilometrosAMillas(double kilometros)
{
double factorConversion = 0.621371;
return kilometros * factorConversion;
}
}
Este ejemplo convierte una distancia ingresada en kilómetros a millas, usando TryParse para validar la entrada. La salida se muestra con dos decimales usando el formato "F2" en ToString().
