Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 0.1<>0.1 dlaczego liczba liczbie nie równa?
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
greg87g
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?
#luq
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
greg87g
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?
mortus
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.
!*!
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
greg87g
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)

!*!
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
#luq
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.
Crozin
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.