Los numeros decimales nos permiten representar números reales, es decir, aquellos que pueden tener una parte fraccionaria y ser positivos o negativos.
En C#, los tipos principales para almacenar números decimales son float, double y decimal.
Cada uno tiene un rango y precisión específicos, los cuales deben tenerse en cuenta dependiendo del tipo de cálculos que se vayan a realizar.
| Tipo C# | Tipo .NET | Bits | Precisión | Sufijo | ¿Para qué usarlo? |
|---|---|---|---|---|---|
float | Single | 32 | ~7 dígitos | f | Gráficos 3D, Unity, ML, Arrays gigantes. |
double | Double | 64 | ~15 dígitos | d | Ciencia, Ingeniería, uso general. |
decimal | Decimal | 128 | ~28 dígitos | m | Dinero, Finanzas, Contabilidad. |
- ¿Estás calculando dinero, nóminas, precios o cualquier cosa donde perder un céntimo sea ilegal o un problema? Usa
decimal. - ¿Estás haciendo un videojuego, procesando audio o trabajando con redes neuronales? Usa
float. - ¿Ninguna de las anteriores (uso general, matemáticas)? Usa
double(es el estándar por defecto en C#).
Punto flotante: float y double
Los tipos float y double son tipos de Punto Flotante Binario. Están diseñados siguiendo el estándar IEEE 754, que es la norma que siguen casi todos los procesadores modernos para hacer matemáticas rápidas.
Internamente, no guardan el número exacto. Guardan una aproximación científica basada en tres partes:
- Signo: Positivo o negativo.
- Mantisa: Los dígitos significativos del número.
- Exponente: Dónde colocamos la coma decimal (de ahí lo de “punto flotante”, la coma se mueve).
Esto permite representar números astronómicamente grandes o microscópicamente pequeños, pero con un coste: pérdida de precisión.
float (precisión simple)
- Tamaño: 32 bits (4 bytes).
- Precisión: ~6-9 dígitos.
- Sufijo:
foF. - Uso: Gráficos 3D (Unity usa
floatpara todo), motores físicos, procesamiento de señales donde la velocidad es crítica y un pequeño error es aceptable.
float gravedad = 9.81f; // Nota la 'f' al final
double (doble precisión)
- Tamaño: 64 bits (8 bytes).
- Precisión: ~15-17 dígitos.
- Sufijo:
doD(opcional, es el default). - Uso: Cálculos científicos, matemáticas generales.
double distanciaSol = 149_600_000.5; // Por defecto es double
En C#, cualquier número con decimales que escribas en el código (literal), como 3.14, es interpretado automáticamente como double. Si quieres que sea float, **tienes que poner la f**.
La solución de alta precisión decimal
Si float y double son rápidos pero “imprecisos”, decimal es todo lo contrario.
El tipo decimal es un tipo de Punto Flotante de 128 bits diseñado específicamente para cálculos financieros y monetarios. A diferencia de sus hermanos, decimal utiliza base 10 en lugar de base 2 para su parte fraccionaria.
Esto significa que números como se representan de forma exacta.
- Tamaño: 128 bits (16 bytes).
- Precisión: 28-29 dígitos significativos.
- Sufijo:
moM(de “Money”). - Rango: Más pequeño que
double, pero mucho más preciso. - Rendimiento: Mucho más lento (calculado por software, no por hardware).
decimal precio = 19.99m; // La 'm' es OBLIGATORIA
decimal impuesto = 0.21m;
decimal total = precio * (1 + impuesto); // Cálculo exacto, sin errores de redondeo extraño
Si intentas asignar un literal double a un decimal sin el sufijo m, el compilador te dará un error. C# te protege para que no pierdas precisión sin querer.
Operaciones matemáticas comunes
Las operaciones aritméticas son similares a las de los enteros. Podemos realizar suma, resta, multiplicación y división con números de punto flotante.
double x = 10.5;
double y = 3.2;
double suma = x + y;
double resta = x - y;
double multiplicacion = x * y;
double division = x / y;
Console.WriteLine($"Suma: {suma}");
Console.WriteLine($"Resta: {resta}");
Console.WriteLine($"Multiplicación: {multiplicacion}");
Console.WriteLine($"División: {division}");
La clase Math en C# proporciona métodos útiles para realizar operaciones matemáticas avanzadas. Lo veremos en el siguiente tutorial
Ejemplos prácticos
Cálculo del interés compuesto
Este ejemplo calcula el interés compuesto utilizando el tipo decimal para garantizar precisión en cálculos financieros:
decimal principal = 1000.0m; // Capital inicial
decimal tasaInteres = 0.05m; // Tasa de interés anual (5%)
int años = 10; // Período en años
decimal montoFinal = principal * (decimal)Math.Pow((double)(1 + tasaInteres), años);
Console.WriteLine($"Monto final después de {años} años: {montoFinal:C}");
Conversión de temperaturas
Este ejemplo convierte una temperatura de Celsius a Fahrenheit utilizando el tipo double:
double celsius = 25.0;
double fahrenheit = (celsius * 9 / 5) + 32;
Console.WriteLine($"{celsius}°C es igual a {fahrenheit}°F");
Cálculo de la media y desviación estándar
Como ejemplo de uso de números de punto flotante, calculemos la media y desviación estándar de una lista de números en C#.
using System;
using System.Linq;
public class Estadistica
{
public static void Main()
{
double[] valores = { 1.5, 2.3, 3.1, 4.7, 5.8 };
double media = valores.Average();
double sumaCuadrados = valores.Select(val => Math.Pow(val - media, 2)).Sum();
double desviacionEstandar = Math.Sqrt(sumaCuadrados / valores.Length);
Console.WriteLine($"Media: {media}");
Console.WriteLine($"Desviación Estándar: {desviacionEstandar}");
}
}
En este ejemplo:
- Usamos
Average()para calcular la media de los valores. - Calculamos la desviación estándar usando
Math.PowyMath.Sqrt, funciones de la bibliotecaMath.
