viernes, 12 de julio de 2013

Tipos de Datos Numéricos en C# - Parte 2

Tabla de Contenido

1. Palabras Clave
2. Introducción
3. Generalidades de los Tipos de Conversión
4. Conversión de Entero a Entero
5. Conversión de Punto Flotante a Punto Flotante
6. Conversión de Punto Flotante a Entero
7. Conversión de Decimales
8. Conclusiones
9. Literatura & Enlaces

1. Palabras Clave

  • Cast
  • Conversin
  • Magnitud
  • Precisión

2. Introducción

Las conversiones numéricas son necesarias en situaciones donde se requiera la manipulación de valores de distinta naturelaza, ya sean números naturales, enteros, reales, entre otros, para operaciones tan sencillas como las aritméticas. El lenguaje de programación C# permite realizar estas operaciones de forma muy simple, sin embargo, el programador debe tener en cuenta determinadas reglas al efectuar conversiones entre tipos de datos ya sea de forma implícita o explícita.

3. Generlidades de los Tipos de Conversión

Las conversines implícitas son aquellas que poseen las reglas más sencillas: en primer lugar, sólo hay que tener en cuenta la capacidad numérica del tipo origen y del tipo destino. Miremos la Tabla 1 (Albahari (2012)):
Conversiones numéricas implícitas
Tabla 1. Conversiones Numéricas  Implícitas (Albahari (2012)).
Para el caso de las conversiones explícitas, se debe considerar la pérdida de precisión (como veremos más adelante de tipos de punto flotante a tipos enteros).

4. Conversión de Entero a Entero

Para las conversiones entre números enteros se siguen estas reglas:
  • Si el tipo de dato del destino tiene mayor capacidad numérica que el tipo del origen, la conversión se realiza de forma implícita.
  • Si el tipo de dato del destino tiene menor capacidad numérica que el tipo del origen, es necesario realizar un cast (forma explícita).
En el siguiente ejemplo se manifiesta el uso de estas dos reglas:

int x = 12345; // int entero de 32 bits
long y = x; // Conversión implícita a entero de 64 bits
short z = (short) x; // Conversión explícita a entero de 16 bits

Adicionalmente, en la Tabla 2 (Albahari (2012)) se puede ver la capacidad numérica y de bits de los tipos de datos enteros.
Tipos de datos enteros
Tabla 2. Tipos de Datos Enteros [2].

5. Conversión de Punto Flotante a Punto Flotante

Las conversiones de datos de tipo float a double se realizan de forma implícita, esto se debe a que double puede representar cada valor posible de float, así:

De float a double (implícita):

float f1 = 3.14159F;
double d1 = f;

De double a float (explícita):

double d2 = 3.14159;
float f2 = (float) d2;

6. Conversión de Punto Flotante a Entero

Al convertir un valor de tipo de dato entero a cualquiera de los tipos de dato de punto flotante, éste proceso se realiza de forma implícita:

De int a float (implícita):

int i1 = 1;
float f1 = i1;

De float a int (implícita):

float f2 = 3.14159F;
int i2 = (int) f2;

Advertencia

Cuando se convierte de un número flotante a un entero, la parte fraccionaria se trunca y ningún proceso de redondeo se realiza. El Framework .NET contiene la clase estática System.Convert que provee métodos útiles para conversiones entre tipos.

Cuando se realiza una conversión de un entero grande a un tipo de dato flotante la magnitud se preserva, pero en ocasiones se pierde precisión (ver enlaces). La razón se debe a que los tipos flotante tiene más magnitud que los enteros pero menor precisión. Veamos el siguiente ejemplo:

int i1 = 100000001;
float f = i1; // La magnitud se conserva, pero hay pérdida de precisión
int i2 = (int) f; // Valor en i2 100000000

7. Conversión de Decimales

De acuerdo con Albahari (2012), cualquier tipo de de dato entero puede ser convertido implícitamente a tipo de datos decimales, dado que un decimal puede representar cualquier valor posible de datos enteros en el lenguaje de programación C#. Por el contrario, al convertir de decimal a entero, el cast debe ser explícito.

8. Conclusiones

Tener claras las reglas de conversión entre tipos de datos enteros es de suma importancia cuando creamos nuestras aplicaciones, por ejemplo, debemos considerar la pérdida de precisión cuando se realizan conversiones de enteros grandes a punto flotante, dado que puede conducir a errores en los cálculos.

9. Literatura & Enlaces

[1] Implicit Numeric Conversions Table - http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.110).aspx
[2] Integral Types Table (C# Reference) - http://msdn.microsoft.com/en-us/library/exx3b86w(v=vs.110).aspx
[3] The Floating-Point Guide - Floating Point Numbers - http://floating-point-gui.de/formats/fp/
[4] Why does C# allow an *implicit* conversion from Long to Float, when this could lose precision? - Stack Overflow - http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co
[5] C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.