[JavaScript] Problem z niedokładnością 3353 2

O temacie

Autor Sauron

Zaczęty 28.05.2013 roku

Wyświetleń 3353

Odpowiedzi 2

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Witam. Zrobiłem sobie taką animację ukrywania i pojawiania się zdjęcia, która polega na zmianie 'opacity'. Wszystko działa tylko, że przy odejmowaniu (jak i dodawaniu) zauważyłem drobny błąd, chcę odjąć 0.01, co jakiś czas tylko że po pewnym czasie opacity wynosiło 0.59999999999996! Wielokrotne odejmowanie 0.01 od 1.0 nigdy nie wyniesie takiej liczby... Słyszałem, że w Java są podobne błędy, ale Java a JavaScript to co innego...
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

[JavaScript] Problem z niedokładnością
#1 2013-05-28, 17:59(Ostatnia zmiana: 2013-05-28, 18:00)
To nie jest wina wynikająca z języka programowania, ale z tego jak komputer obsługuje liczby zmiennoprzecinkowe.
float 0.1 = "prawdziwe" 0.100000001490116119384765625
Nic z tym nie zrobisz, ale też nie jest to żaden problem, nie da się w praktyce zauważyć tak znikomej różnicy. Chyba że twoim problemem jest to że próbujesz porównać dwie liczby zmiennoprzecinkowe za pomocą == i wychodzi ci fałsz, mimo że powinna wyjść prawda. Rozwiązanie jest proste - tego operatora nie używa się do porównywania wartości zmiennoprzecinkowych kiedy jest ryzyko podobnej niedokładności. Zamiast tego pisze się funkcje porównujące je z określoną dokładnością - np odejmuj je od siebie i sprawdzaj czy to co ci wyjdzie jest mniejsze niż 0.001. Jeśli jest, to można je potraktować jakby były równe.

http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Tak, chce porównać wartości, ale nie tylko. Jak już pisałem: co jakiś czas zmniejsza się opacity zdjęcia, aż do 0. W ostatnich milisekundach powinno zostać 0.01 a zostaje 0.01....coś tam coś tam, skrypt odejmnie więc 0.01 i zostaje ok. 0.0099999 i jakby odjął jeszcze raz byłoby na minusie... mogę zaokrąglić wynik do 2 cyfr po przecinku?

EDIT: Już sobie poradziłem (potęga 10 do kwadratu przez 10 do kwadratu) :D  
Można zamknąć
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry