Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 0.1<>0.1 dlaczego liczba liczbie nie równa?
-greg87g-
post 6.09.2011, 10:52:52
Post #1





Goście







witam,
problem pewnie będzie banalny, ale nie bardzo wiem jak mogę szukać rozwiązania.

dlaczego podczas działania:
  1. var liczba=1;
  2. var odjemnik=0.1;
  3.  
  4. while(liczba>0){
  5. liczba-=odjemnik;
  6. alert(liczba);
  7. };


wartosci zwracane to: 0.9 ; 0.8; 0.7000000000000001; 0.6000000000000001; 0.5000000000000001 ; 0.40000000000000013 itd?

dlaczego 0.1 nie zawsze równa się 0.1?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
#luq
post 6.09.2011, 11:17:24
Post #2





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Ogólnie - JS źle liczy sad.gif
[JAVASCRIPT] pobierz, plaintext
  1. console.log(0.2 + 0.4); //// 0.6000000000000001
[JAVASCRIPT] pobierz, plaintext


Zaokrąglaj liczby i porównuj te zaokrąglone i będzie okej wink.gif


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
-greg87g-
post 6.09.2011, 11:22:32
Post #3





Goście







Cytat(#luq @ 6.09.2011, 12:17:24 ) *
Ogólnie - JS źle liczy sad.gif



ale jak to tak, komputer źle liczy? trzeba mu zaokrąglić każdą liczbę na wypadek gdyby sobie coś za dużo dodał lub odjął?
coś mi to nie pasuje.

czy jest zatem jakiś sposób (bez obchodzenia do okoła z calym tym zaokrągleniem) żeby łagodnie zmniejszyć css.opacity?
Go to the top of the page
+Quote Post
mortus
post 6.09.2011, 11:24:53
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


To nie problem związany z JavaScript, ale problem z precyzją liczb zmiennoprzecinkowych. Maszyna nie potrafi dokładnie policzyć wartości przy operacjach na takich właśnie liczbach.

Trzeba zaokrąglać.

@down: Nie, JS nie liczy dobrze, bo 0.2 - 0.1 to jednak 0.1, a nie 0.1000000000000001..., ale z takimi obliczeniami nie tylko JS sobie nie radzi.

Ten post edytował mortus 6.09.2011, 11:29:30
Go to the top of the page
+Quote Post
!*!
post 6.09.2011, 11:24:56
Post #5





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Tak, jQuery .animate() lub .fade() wink.gif JS liczy dobrze, to Ty masz ustalić jaką liczbę chcesz pozyskać.

edit: @up dlatego to Ty właśnie masz to ustalić jak daną liczbę ma wyświetlić poprzez zastosowanie odpowiedniej funkcji bo niby skąd maszyna ma wiedzieć o co Ci chodzi? Skoro nawet nie wie że 7 jest pomiędzy 5 a 8 wink.gif

Ten post edytował !*! 6.09.2011, 11:33:27


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
-greg87g-
post 6.09.2011, 11:39:50
Post #6





Goście







dzieki *!* wygląda na to że o animate mi chodziło, zaraz jeszcze poczytam ale już widze ze to to.

a tak swoją drogą to też jestem zdania że jeśli 0.7-0.1 nie równa się 0.6 to błąd leży tylko po stronie komputera. dlaczego komputer ma wymagac od nas abyśmy określili czy ma zadanie wykonać prawidłowo czy nie?

zdaję sobie sprawe ze komputer nie rozumie zasad logiki i nic ponad to co się w niego włoży nie "wymyśli", ale zrozumiałym jest wtedy stwierdzenie ze liczy źle jeśli liczy źle (nawet jeśli zgodnie z zaprogramowaniem)

Go to the top of the page
+Quote Post
!*!
post 6.09.2011, 11:43:54
Post #7





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Akurat alert(0.7-0.1); wyświetli prawidłowo. Maszyna jest precyzyjna. wink.gif dlatego w JS aby uzyskać taki efekt należy przepuścić to przez toFixed(1).

[JAVASCRIPT] pobierz, plaintext
  1. var liczba=1;
  2. var odjemnik=0.1;
  3.  
  4. while(liczba>0){
  5. liczba-=odjemnik;
  6. alert(liczba.toFixed(1));
  7. };
[JAVASCRIPT] pobierz, plaintext


Ten post edytował !*! 6.09.2011, 12:01:40


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
#luq
post 6.09.2011, 12:04:06
Post #8





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Oczywiście moje
Cytat
Ogólnie - JS źle liczy sad.gif

Należy odebrać tak półserio.

Całość oczywiście polega na sposobie reprezentacji liczb zmiennoprzecinkowych w pamięci, tak jak już napisano.
Wiedziałem że uda mi się znaleźć- http://webhosting.pl/Co.wam.doskwiera.w.Ja...wad.tego.jezyka punkt 9. a raczej bardziej patrz komentarze pod wpisem co do tego punktu. Myślę że to wszystko wyjaśni.


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
Crozin
post 9.09.2011, 18:37:06
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Jest taka prosta zasada: nigdy nie porównuj liczb zmiennoprzecinkowych operatorem porównania. Liczby te działają na przybliżeniach, a nie na realnych wartościach. 0.3 czy 0.1 to takie książkowe przykłady działania na przybliżeniach. Jeżeli potrzebujesz precyzji przy takich operacjach musisz skorzystać z innego, już nie prymitywnego, typu danych.

Do poczytania:
- Wiki: liczby zmiennoprzecinkowe
- Google: porównywanie liczb zmiennoprzecinkowych
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:05