2.2. Tipo de datos real
Cuando queremos almacenar datos con decimales, no nos sirve el tipo de datos "int". Necesitamos otro tipo de datos que sí esté preparado para guardar números "reales" (con decimales). En el mundo de la informática hay dos formas de trabajar con números reales:
- Coma fija: el número máximo de cifras decimales está fijado de antemano, y el número de cifras enteras también. Por ejemplo, con un formato de 3 cifras enteras y 4 cifras decimales, el número 3,75 se almacenaría correctamente, el número 970,4361 también, pero el 5,678642 se guardaría como 5,6786 (se perdería a partir de la cuarta cifra decimal) y el 1010 no se podría guardar (tiene más de 3 cifras enteras).
- Coma flotante: el número de decimales y de cifras enteras permitido es variable, lo que importa es el número de cifras significativas (a partir del último 0). Por ejemplo, con 5 cifras significativas se podrían almacenar números como el 13405000000 o como el 0,0000007349 pero no se guardaría correctamente el 12,0000034, que se redondearía a un número cercano.
2.2.1. Simple y doble precisión
Tenemos tres tamaños para elegir, según si queremos guardar números con mayor cantidad de cifras o con menos. Para números con pocas cifras significativas (un máximo de 7, lo que se conoce como "un dato real de simple precisión") existe el tipo "float" y para números que necesiten más precisión (unas 15 cifras, "doble precisión") tenemos el tipo "double". En C# existe un tercer tipo de números reales, con mayor precisión todavía, que es el tipo "decimal":
float | double | decimal | |
Tamaño en bits | 32 | 64 | 128 |
Valor más pequeño | -1,5•10-45 | 5,0•10-324 | 1,0•10-28 |
Valor más grande | 3,4•1038 | 1,7•10308 | 7,9•1028 |
Cifras significativas | 7 | 15-16 | 28-29 |
Para definirlos, se hace igual que en el caso de los números enteros:
float x;
o bien, si queremos dar un valor inicial en el momento de definirlos (recordando que para las cifras decimales no debemos usar una coma, sino un punto):
float x = 12.56;
2.2.2. Mostrar en pantalla números reales
Al igual que hacíamos con los enteros, podemos leer como cadena de texto, y convertir cuando vayamos a realizar operaciones aritméticas. Ahora usaremos Convert.ToDouble cuando se trate de un dato de doble precisión y Convert.ToSingle cuando sea un dato de simple precisión (float):
using System; public class Ejemplo05 { public static void Main() { float primerNumero; float segundoNumero; float suma; Console.WriteLine("Introduce el primer número"); primerNumero = Convert.ToSingle(Console.ReadLine()); Console.WriteLine("Introduce el segundo número"); segundoNumero = Convert.ToSingle(Console.ReadLine()); suma = primerNumero + segundoNumero; Console.WriteLine("La suma de {0} y {1} es {2}", primerNumero, segundoNumero, suma); } }
Cuidado al probar este programa: aunque en el fuente debemos escribir los decimales usando un punto, como 123.456, al poner el ejecutable en marcha parte del trabajo se le encarga al sistema operativo, de modo que si éste sabe que en nuestro país se usa la coma para los decimales, considere la coma el separador correcto y no el punto, como ocurre si introducimos estos datos en la versión española de Windows XP:
ejemplo05 Introduce el primer número 23,6 Introduce el segundo número 34.2 La suma de 23,6 y 342 es 365,6
2.2.2. Formatear números
En más de una ocasión nos interesará formatear los números para mostrar una cierta cantidad de decimales: por ejemplo, nos puede interesar que una cifra que corresponde a dinero se muestre siempre con dos cifras decimales, o que una nota se muestre redondeada, sin decimales.
Una forma de conseguirlo es crear una cadena de texto a partir del número, usando "ToString". A esta orden se le puede indicar un dato adicional, que es el formato numérico que queremos usar, por ejemplo: suma.ToString("0.00")
Algunos de los códigos de formato que se pueden usar son:
- Un cero (0) indica una posición en la que debe aparecer un número, y se mostrará un 0 si no hay ninguno.
- Una almohadilla (#) indica una posición en la que puede aparecer un número, y no se escribirá nada si no hay número.
- Un punto (.) indica la posición en la que deberá aparecer la coma decimal.
- Alternativamente, se pueden usar otros formatos abreviados: por ejemplo, N2 quiere decir "con dos cifras decimales" y N5 es "con cinco cifras decimales".
Vamos a probarlos en un ejemplo:
using System; public class Ejemplo06 { public static void Main() { double numero = 12.34; Console.WriteLine( numero.ToString("N1") ); Console.WriteLine( numero.ToString("N3") ); Console.WriteLine( numero.ToString("0.0") ); Console.WriteLine( numero.ToString("0.000") ); Console.WriteLine( numero.ToString("#.#") ); Console.WriteLine( numero.ToString("#.###") ); } }
El resultado de este ejemplo sería:
ejemplo06 12,3 12,340 12,3 12,340 12,3 12,34
Como se puede ver, ocurre lo siguiente:
- Si indicamos menos decimales de los que tiene el número, se redondea.
- Si indicamos más decimales de los que tiene el número, se mostrarán ceros si usamos como formato Nx o 0.000, y no se mostrará nada si usamos #.###
- Si indicamos menos cifras antes de la coma decimal de las que realmente tiene el número, aun así se muestran todas ellas.
Ejercicios propuestos:
- El usuario de nuestro programa podrá teclear dos números de hasta 12 cifras significativas. El programa deberá mostrar el resultado de dividir el primer número entre el segundo, utilizando tres cifras decimales.
- Crear un programa que use tres variables x,y,z. Las tres serán números reales, y nos bastará con dos cifras decimales. Deberá pedir al usuario los valores para las tres variables y mostrar en pantalla el valor de x2 + y - z (con exactamente dos cifras decimales).