[ Foro de C# ]

Sobre for con números reales

07-Aug-2014 21:16
Invitado (wind)
3 Respuestas

Saludos.

Al ingresar un número, si el usuario escribe 80, aparecerán los números del 0 hasta el 80. (Bueno en la pantalla se verá del 50,2 al 80,0)
Pero al ingresar el 20, aparecerá pantalla ( 0,0 hasta el 19,9). Mi pregunta es: ¿Por qué no aparece hasta el 20,0? .. Estoy tratando de comprender el funcionamiento del for.
Lo mismo sucede al ingresar 30 (0,0 hasta 29,9) debería mostrar hasta el 30,0.
Si ingreso 100, aparecen los números del 70,5 hasta el 100,0 (Busco que se vean los números del 0 hasta 100,0 en pantalla)
¿Alguna solución al respecto?

 
using System;
 
namespace fornumerosdecimalesparte2
{
    class Program
    {
        static void Main()
        {
            double nt;
            double p;
 
            Console.Write("Ingrese un numero: ");
            nt = Convert.ToDouble(
                Console.ReadLine());
            while (nt <= 0)
            {
                Console.Write("Ingrese un número mayor que cero: ");
                nt = Convert.ToDouble(
                    Console.ReadLine());
            }
 
            while (nt >= 999999999999999)
            {
                Console.Write("Ingrese un número que no supere las 14 cifras: ");
                nt = Convert.ToDouble(
                    Console.ReadLine());
            }
 
            for (p= 0; p <= nt; p=p+0.1)
                Console.WriteLine("{0}", p.ToString("N1"));
            Console.ReadKey();
        }
    }
}
 




09-Aug-2014 00:19
Nacho Cabanes (+31)

Lo siento, no acabo de entender... ¿es un programa que debería escribir incrementando 0,1 en cada pasada, que está fallando y que quieres descubrir por qué falla?

Si es así, en primer lugar que sepas que esos dos while independientes no son fiables. Puedes saltarte el primero con un número que no sería válido para el segundo, y luego saltarte el segundo con un número que no sea válido para el primer "while". Deberías unir las dos condiciones en una.

En cuanto a la pregunta en sí, ten en cuenta que los números reales se almacenan con una cierta pérdida de precisión. Si resulta que al hacer 29.9 + 0.1 el número obtenido es realmente 30.000000000001, ya es mayor que 30 y no se mostrará. Puedes intentar esquivar el problema permitiendo un cierto margen de error en el "for":

 
            for (p= 0; p <= nt+0.001; p=p+0.1)
                Console.WriteLine("{0}", p.ToString("N1"));
 




09-Aug-2014 01:27
Invitado (wind)

Excelente respuesta, ahora funciona bien la precisión decimal. Lo he probado!

Solo tengo una duda:

"Al ingresar 100... entiendo el for recorre los números del 0 al 100.
pero hay un problema, a mi parecer hay una limitante de pantalla, refiriéndome a la consola, porque me muestra solo los números del 70,2 al 100,0 "

Adjunto dos imágenes para ser lo más explicativo.

El usuario ingresa un número: 100

https://mega.co.nz/#!UpU3jb4T!ylb81MIOfj97kHgRsi2MgQrohDuPm8yzPwocyRUZBKc

https://mega.co.nz/#!lskmyDbC!_inTVw1Ml-q7CkNmvAOeq0OPk0YbU6OUPn8g2mxc4pk


Busco que el usuario, al ingresar "100",  vea en pantalla todos los números, es decir: del 0 al 100.

Saludos!


12-Aug-2014 20:20
Nacho Cabanes (+31)

El tamaño de pantalla es el que es. Si usas "WriteLine" sólo escribes un dato por línea, así que sólo verás las últimas 25 líneas. El "buffer" es un poco mayor, pero no se trata de que el usuario tenga que hacer scroll.

Para mostrar muchos datos en pantalla, lo razonable es usar "Write" en vez de "WriteLine", con un espacio tras cada número. Aun así, un pantalla convencional de 80x25 tiene 2000 caracteres, así que te cabrán unos 400 números en el formato "XX.X".






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)