¿Diferencia entre decimal, flotante y doble en .NET?
¿ Cuál es la diferencia entre y decimal
en .NET?float
double
¿Cuándo alguien usaría uno de estos?
float
(el alias de C# para System.Single
) y double
(el alias de C# para System.Double
) son tipos de punto binario flotante . float
es de 32 bits; double
es de 64 bits. En otras palabras, representan un número como este:
10001.10010110011
El número binario y la ubicación del punto binario están codificados dentro del valor.
decimal
(el alias de C# para System.Decimal
) es un tipo de punto decimal flotante . En otras palabras, representan un número como este:
12345.65789
Nuevamente, el número y la ubicación del punto decimal están codificados dentro del valor; eso es lo que hace que decimal
siga siendo un tipo de punto flotante en lugar de un tipo de punto fijo.
Lo importante a tener en cuenta es que los humanos están acostumbrados a representar números no enteros en forma decimal y esperan resultados exactos en representaciones decimales; No todos los números decimales son exactamente representables en coma flotante binaria (0,1, por ejemplo), por lo que si utilizas un valor de coma flotante binaria obtendrás una aproximación a 0,1. También obtendrás aproximaciones cuando utilices un punto decimal flotante; por ejemplo, el resultado de dividir 1 entre 3 no se puede representar exactamente.
En cuanto a qué usar cuando:
Para valores que son "decimales naturalmente exactos", es bueno utilizar
decimal
. Esto suele ser adecuado para cualquier concepto inventado por el hombre: los valores financieros son el ejemplo más obvio, pero también hay otros. Consideremos, por ejemplo, la puntuación otorgada a los buceadores o a los patinadores sobre hielo.Para valores que son más bien artefactos de la naturaleza que de todos modos no pueden medirse con exactitud ,
float
/double
son más apropiados. Por ejemplo, los datos científicos normalmente se representarían de esta forma. Aquí, para empezar, los valores originales no serán "decimales exactos", por lo que no es importante que los resultados esperados mantengan la "precisión decimal". Es mucho más rápido trabajar con tipos de coma binaria flotante que con decimales.
La precisión es la principal diferencia.
Flotante : 7 dígitos (32 bits)
Doble -15-16 dígitos (64 bits)
Decimal -28-29 dígitos significativos (128 bits)
Los decimales tienen una precisión mucho mayor y generalmente se usan en aplicaciones financieras que requieren un alto grado de precisión. Los decimales son mucho más lentos (hasta 20 veces en algunas pruebas) que un doble/flotante.
Los decimales y los flotantes/dobles no se pueden comparar sin una conversión, mientras que los flotantes y los dobles sí. Los decimales también permiten la codificación o los ceros finales.
float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
Resultado :
float: 0.3333333
double: 0.333333333333333
decimal: 0.3333333333333333333333333333
+---------+----------------+---------+----------+---------------------------------------------------------+
| C# | .Net Framework | Signed? | Bytes | Possible Values |
| Type | (System) type | | Occupied | |
+---------+----------------+---------+----------+---------------------------------------------------------+
| sbyte | System.Sbyte | Yes | 1 | -128 to 127 |
| short | System.Int16 | Yes | 2 | -32,768 to 32,767 |
| int | System.Int32 | Yes | 4 | -2,147,483,648 to 2,147,483,647 |
| long | System.Int64 | Yes | 8 | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| byte | System.Byte | No | 1 | 0 to 255 |
| ushort | System.Uint16 | No | 2 | 0 to 65,535 |
| uint | System.UInt32 | No | 4 | 0 to 4,294,967,295 |
| ulong | System.Uint64 | No | 8 | 0 to 18,446,744,073,709,551,615 |
| float | System.Single | Yes | 4 | Approximately ±1.5e-45 to ±3.4e38 |
| | | | | with ~6-9 significant figures |
| double | System.Double | Yes | 8 | Approximately ±5.0e-324 to ±1.7e308 |
| | | | | with ~15-17 significant figures |
| decimal | System.Decimal | Yes | 16 | Approximately ±1.0e-28 to ±7.9e28 |
| | | | | with 28-29 significant figures |
| char | System.Char | N/A | 2 | Any Unicode character (16 bit) |
| bool | System.Boolean | N/A | 1 / 2 | true or false |
+---------+----------------+---------+----------+---------------------------------------------------------+
Consulte aquí para obtener más información .