¿Diferencia entre decimal, flotante y doble en .NET?

Resuelto asked hace 15 años • 18 respuestas

¿ Cuál es la diferencia entre y decimalen .NET?floatdouble

¿Cuándo alguien usaría uno de estos?

 avatar Mar 06 '09 18:03
Aceptado

float(el alias de C# para System.Single) y double(el alias de C# para System.Double) son tipos de punto binario flotante . floates de 32 bits; doublees 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 decimalsiga 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/ doubleson 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.

Jon Skeet avatar Mar 06 '2009 11:03 Jon Skeet

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
cgreeno avatar Mar 06 '2009 11:03 cgreeno
+---------+----------------+---------+----------+---------------------------------------------------------+
| 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 .

 avatar Jun 07 '2013 12:06