• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Javascript - błąd języka?

Object Storage Arubacloud
0 głosów
157 wizyt
pytanie zadane 2 czerwca 2019 w JavaScript przez program naczelny Gaduła (3,320 p.)

Witam serdecznie!

Programuję grę w js, w której mam planszę 40 kwadratów na 40. Muszę poruszać się obiektem między elementami tej tabeli a dla płynności rzecz jasna nie może ten obiekt skakać od jednego kwadrata do drugiego tylko przepływać. Zatem zamiast robić x_w_stosunku_do_tabeli-- robię x_w_stosunku_do_tabeli-=0.1

I tu pojawia się problem. 


var  x=20, y=20;

 function loop(){	 
 var turn = setInterval(function game() {
 x-=0.1; 
 if(x<=15)x=20;
 console.log(x, " *ekhm* ");
 }, 100);}
  
  
 loop();

Ten kod teorytycznie powinien odejmować od 20,  0.1 aż będzie 15. Ale tak nie jest. Zamiast odejmować 0.1 javashit stwierdza: a może tak zepsuć dzień koledze i odjąć 0.100000003. oczywiście ja muszę znaleźć moment w którym obiekt jest w 19,18,17,16, i zwykły if nie wystarczy. Wyjaśni ktoś dlaczego taki problem występuje?

 

1 odpowiedź

+1 głos
odpowiedź 2 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 2 czerwca 2019 przez program naczelny
 
Najlepsza

javashit stwierdza: a może tak zepsuć dzień koledze i odjąć 0.100000003

:D

To natura liczb zmiennoprzecinkowych - nie da się na nich pracować z pełną precyzją i porównania z `==` prędzej czy później się zepsują. W Javascripcie obecnie wszystkie wartości liczbowe są reprezentowane liczbami zmiennoprzecinkowymi.

Tutaj dokładniejszy opis: https://floating-point-gui.de/

Można to rozwiązywać przez na przykład porównywanie z dokładnością do jakiejś wartości, liczenie wszystkiego na liczbach całkowitych (raczej najprostsze?) lub użycie osobnej biblioteki do liczb o dowolnej precyzji.

komentarz 2 czerwca 2019 przez program naczelny Gaduła (3,320 p.)
Tak myślałem, już od dłuższego czasu (po przejściu z c++) mind fcka miałem,
natomiast stosowanie zaokrąglania jako solution problemu nadałem :)

 

 

  Ps: Serio js jest dziwny: tabele wielowymiarowe to nie tabele wielowymiarowe tylko tabele w          tabeli, wszędzie obiekty, == nie funkcjonuje.
komentarz 2 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Tak myślałem, już od dłuższego czasu (po przejściu z c++) mind fcka miałem,
natomiast stosowanie zaokrąglania jako solution problemu nadałem :)

W C++ie przy użyciu liczb zmiennoprzecinkowych miałbyś dokładnie te same problemy ;)

tabele wielowymiarowe to nie tabele wielowymiarowe tylko tabele w          tabeli

A tego nie zrozumiałem. To raczej nie jest dziwne, w większości języków to właśnie po prostu tablica w tablicy. Zazwyczaj tylko języki niższego poziomu udostępniają dodatkowo tablice "prostokątne dwuwymiarowe" będące pod spodem tablicą jednowymiarową.

komentarz 2 czerwca 2019 przez program naczelny Gaduła (3,320 p.)
to szczerze mówiąc nie wiedziałem o tym. Dopiero teraz naszła mnie potrzeba użycia takiej tabeli w js więc zauważyłem nieco dziwną zmianę. W c++ się definiowało po prostu int table[5][5] a tutaj jakieś zwijasy :}

Podobne pytania

0 głosów
0 odpowiedzi 1,522 wizyt
+1 głos
2 odpowiedzi 89 wizyt
pytanie zadane 9 sierpnia 2023 w Systemy operacyjne, programy przez gregorygreg Nowicjusz (180 p.)
0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 13 maja 2020 w Systemy operacyjne, programy przez xeezz Nowicjusz (240 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...