🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
5 messages
5 total messages Started by robi Sat, 09 Jan 2010 13:21
float
#21318
Author: robi
Date: Sat, 09 Jan 2010 13:21
8 lines
927 bytes
Witam,
Jaki może być problem z dodawaniem dwóch liczb flota x=8,1 y=0,8 
suma=8,9000001
Dlaczego nie otrzymuje  suma=8,9 ?

pozdrawiam
Robi
 
Re: float
#21319
Author: Grzegorz Skoczylas
Date: Sat, 09 Jan 2010 15:02
24 lines
1915 bytes
W dniu 2010-01-09 14:21, robi pisze:
> Witam,
> Jaki może być problem z dodawaniem dwóch liczb flota x=8,1 y=0,8
> suma=8,9000001
> Dlaczego nie otrzymuje suma=8,9 ?

Bo w przypadku liczb rzeczywistych komputer z reguły wykonuje działania 
na liczbach przybliżonych, więc i wynik jest przybliżony.

Poza tym komputer posługuje się systemem dwójkowym. Niektóre liczby 
dziesiętne po zapisaniu ich w systemie dwójkowym mają końcówki będące 
ułamkami okresowymi. W takiej sytuacji wynik jest tym bardziej przybliżony.

W przypadku liczb rzeczywistych używanych w komputerze możesz co 
najwyżej stwierdzić, że dwie liczby są równe sobie z dokładnością do N 
cyfr dziesiętnych. W podanym przez ciebie przypadku wynik jest poprawny 
z dokładnością do sześciu cyfr dziesiętnych.

-- 
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
Re: float
#21320
Author: robi
Date: Sat, 09 Jan 2010 18:56
37 lines
2406 bytes
Dzięki za wyjaśnienie . Tylko tego problemu nie ma w przypadku typu decimal 
,double
Wiec zastanawiam się kiedy używać decimal , a kiedy float lub double.
A może przy obliczeniach  określić stałą precyzje(Math.Round) . W moim 
przypadku potrzebuje
dokładności do trzech miejsc po przecinku dlatego zdecydowałem się na float.
-- 
Pozdrawiam,
robi

Użytkownik "Grzegorz Skoczylas" <gskoczylas@kasuj-to.rekord.pl> napisał w 
wiadomości grup dyskusyjnych:hia5ri$ugi$1@news.dialog.net.pl...
> W dniu 2010-01-09 14:21, robi pisze:
>> Witam,
>> Jaki może być problem z dodawaniem dwóch liczb flota x=8,1 y=0,8
>> suma=8,9000001
>> Dlaczego nie otrzymuje suma=8,9 ?
>
> Bo w przypadku liczb rzeczywistych komputer z reguły wykonuje działania na 
> liczbach przybliżonych, więc i wynik jest przybliżony.
>
> Poza tym komputer posługuje się systemem dwójkowym. Niektóre liczby 
> dziesiętne po zapisaniu ich w systemie dwójkowym mają końcówki będące 
> ułamkami okresowymi. W takiej sytuacji wynik jest tym bardziej 
> przybliżony.
>
> W przypadku liczb rzeczywistych używanych w komputerze możesz co najwyżej 
> stwierdzić, że dwie liczby są równe sobie z dokładnością do N cyfr 
> dziesiętnych. W podanym przez ciebie przypadku wynik jest poprawny z 
> dokładnością do sześciu cyfr dziesiętnych.
>
> -- 
> Pozdrawiam,
>
> Grzegorz Skoczylas
> http://gskoczylas.rekord.pl
> ----------------------------------------------  
Re: float
#21322
Author: Daniel Stalica
Date: Sun, 10 Jan 2010 12:30
15 lines
1215 bytes
W dniu 2010-01-09 14:21, robi pisze:
> Witam,
> Jaki może być problem z dodawaniem dwóch liczb flota x=8,1 y=0,8
> suma=8,9000001
> Dlaczego nie otrzymuje suma=8,9 ?
>
> pozdrawiam
> Robi
>

daj round z jednym miejscem po przecinku na wynik i po problemie :) 
Ewentualnie licz na liczbach całkowitych 81+8 :)

-- 
Systemy kominowe http://twojkomin.pl
Re: float
#21321
Author: Tomasz Muszyński
Date: Sun, 10 Jan 2010 21:59
21 lines
1949 bytes
W dniu 10-01-09 19:56, robi pisze:
> Dzięki za wyjaśnienie . Tylko tego problemu nie ma w przypadku typu
> decimal ,double
> Wiec zastanawiam się kiedy używać decimal , a kiedy float lub double.
> A może przy obliczeniach określić stałą precyzje(Math.Round) . W moim
> przypadku potrzebuje
> dokładności do trzech miejsc po przecinku dlatego zdecydowałem się na
> float.

Decimal wykorzystujesz np do obliczeń na kwotach - np stan konta 
bankowego nie może być podatny na błędy jakie ma float.
W przypadku typu Double, błąd zapewne nie wyszedł, ponieważ ma on 
większa precyzję, ale przy którymś miejscu po przecinku i tak on wyjdzie.

Jeżeli więc dokonujesz obliczeń matematycznych, gdzie N-te miejsce po 
przecinku nie ma znaczenia to używasz float i double. Dla obliczeń dla 
na kwotach - decimal.

Oczywiście Math.Round() też pomaga.

tm
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads