[C#] dziwne wyniki

0

Dlaczego program taki:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            float x=0;
            for(int a=0;a<10;a++)
            {
                x+=0.1f;
                Console.WriteLine(x);
            }
            Console.ReadKey();
        }
    }
}

Daje wynik:

0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8000001
0,9000001
1

Nie rozumiem dlaczego są liczby
0,8000001
0,9000001

0

Z powodu ograniczenia maszyny do dokładności liczb zmiennoprzecinkowych.

0

Jak to dokładności przecież nie wykonuje złożonych operacji tylko dodaje 0.1 proszę o jakieś dokładniejsze wyjaśnienie

0
Pokemaniak napisał(a)

przecież nie wykonuje złożonych operacji
Dlatego błąd jest zaledwie rzędu 0.00001 %

Pamiętaj, że komputer działa na liczbach binarnych i tak naprawdę liczba 0,1 w systemie dwójkowym wygląda jakoś tak: 0,0011011100101, przy dodawaniu końcówka tego ułamka jest obcinana (dlaczego ? -> http://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa) i stąd błędy zaokrągleń. Spróbuj dodawać np. 0,125 to nie będzie błędów zaokrągleń bo ucięte zostaną same zera (0,125 = 0,001b).

Jeśli ci ten błąd przeszkadza to wystarczy, że będziesz wynik zaokrąglać podczas wyswietlania.

0

dziękuję

0
                decimal f = 0;
                for (int i = 0; i < 10; i++)
                {
                    f += 0.1M;
                    Console.WriteLine(f);
                }

Do takich rzeczy jak dodawanie 0.1 nalepiej służy typ decimal ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1