Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript][PHP]Ograniczenie miejsc po przecinku
warland
post 4.02.2018, 16:57:09
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


Mam tego typu problem że co w 5 wyniku tworzy mi się liczba która nie wiem skąd się wzięła i jak ją ograniczyć.

kod:
  1. function round_down(n) {
  2. if (n > 0) {
  3. return Math.ceil(n / land_size) * land_size;
  4. } else if (n < 0) {
  5. return Math.ceil(n / land_size) * land_size;
  6. } else {
  7. return 0;
  8. }
  9. }
  10.  
  11.  
  12. var lat = round_down(event.latLng.lat()) - land_size;
  13. var lng = round_down(event.latLng.lng());
  14. var coord_slug = lat + ',' + lng;
  15.  


Przykłady wyników po użyciu alert(coord_slug); :
lnt = 52.1
lng = 18.5
land_size = 0.1
wynik coord_slug : 52.1,18.5
działa. Liczby wyświetlają się tak jak są w bazie zapisane

lnt = 52.1
lng = 18.4
land_size = 0.1
wynik coord_slug: 52.1,18.400000000000002
nie działa. Wyświetla się jakiś dziwny wynik


Czy ktoś wie jak temu problemowi zaradzić?
Czy dopisać trzeba do tego coś co ograniczy ilość liczb po przecinku?

Jeśli land size wynosi np. 0.5 , 1 czy 2 wszystko śmiga bez problemu

Proszę pomóżcie..

Ten post edytował warland 4.02.2018, 17:22:30
Go to the top of the page
+Quote Post
darko
post 4.02.2018, 17:38:20
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


var coord_slug = lat.toString() + ',' + lng.toString();


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 17:44:39
Post #3





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


https://developer.mozilla.org/en-US/docs/We.../Number/toFixed

P.S. Czy tam nie powinno być Math.floor dla ujemnych?

Ten post edytował trueblue 4.02.2018, 17:48:12


--------------------
Go to the top of the page
+Quote Post
warland
post 4.02.2018, 18:31:20
Post #4





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


kłopot w tym że to nadal nic nie daje. Zawzięcie mi co 5 pól wywala błąd z tą ilością liczb po przecinku
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 18:36:46
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


To pokaż jak użyłeś, bo ja bym użył tak:
  1. var coord_slug = lat.toFixed(2) + ',' + lng.toFixed(2);


--------------------
Go to the top of the page
+Quote Post
warland
post 4.02.2018, 18:51:06
Post #6





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


teraz to problemem są liczby całkowite.
Jeżeli mam lat=38 i lng 22.2 to mi przy toFixed(1) wywala 38.0 i tworzy też błąd w tym wypadku.
Samo rozwiązanie ukróciło liczby po przecinku. Nie działała mi ta opcja z toString.

Można by było ewentualnie dopisać zero po przecinku w bazie do liczb całkowitych ale nie uśmiecha mi się grzebanie w 15 tys rekordów

Kordy w bazie mają taki zapis w 3 kolumnach.. coord_slug 38,22.4 lat 38 i lng 22.4
Skrypt wyświetla dane gdy dane z coord_slug się zgadzają z lat + lng

Ten post edytował warland 4.02.2018, 18:55:36
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 19:03:15
Post #7





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Nie wiem jaki cudem dla 38 otrzymujesz 38.0.
https://jsfiddle.net/1sd3c61e/


--------------------
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 19:11:11
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


51.9,18.5


--------------------
Go to the top of the page
+Quote Post
warland
post 4.02.2018, 19:13:11
Post #9





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


Cytat(trueblue @ 4.02.2018, 19:11:11 ) *
51.9,18.5


to kordy tego czerwonego pola smile.gif ale nad nim już powinno być 52,18.5
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 19:18:36
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


52.0,18.5

Ale jeśli Twoim problemem jest porównywanie otrzymanych współrzędnych z tymi w bazie, to po prostu trzymasz je w niepoprawnym formacie. Długość i szerokość to powinny być odrębne kolumny. Typ pola na pewno jakiś numeryczny, a nie znakowy.

Na tą chwilę możesz sprawdzać czy parseInt(liczba)==liczba, jeśli tak, to oznacza, że nie ma wartości dziesiętnych i możesz ją przekształcić do postaci całkowitej.


--------------------
Go to the top of the page
+Quote Post
trueblue
post 4.02.2018, 19:49:06
Post #11





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


  1. var a = 52.0001;
  2. var b = 38.1;
  3. a = a.toFixed(1);
  4. b = b.toFixed(1)
  5. if (parseInt(a) == a) {
  6. a = parseInt(a);
  7. }
  8. if (parseInt(b) == b) {
  9. b = parseInt(b);
  10. }
  11. alert(a + ',' + b);


Zapis jest taki, bo taki jest. Jeśli będziesz zapisywał do bazy danych osobno obydwie współrzędne, to problem zniknie.


--------------------
Go to the top of the page
+Quote Post
warland
post 5.02.2018, 00:19:22
Post #12





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 22.01.2018

Ostrzeżenie: (10%)
X----


udało się to rozwiązać w ten sposób:
  1. var coord_slug = (Math.round(lat * 10) / 10) + ',' + (Math.round(lng * 10) / 10);


W tym przypadku math.round nie dodaje przecinka do liczb całkowitych. Następuje zaokrąglenie liczb dziesiętnych do 1 miejsca po przecinku z dokładnością do 0.1


Dziękuję oczywiście za pomoc w naprowadzeniu mnie na rozwiązanie. Łatwiej było szukać gdy już się coś zajarzyło dzięki podpowiedziom.
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: 26.04.2024 - 13:44