Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Ograniczenie miejsc po przecinku
Forum PHP.pl > Forum > Przedszkole
warland
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..
darko
var coord_slug = lat.toString() + ',' + lng.toString();
trueblue
https://developer.mozilla.org/en-US/docs/We.../Number/toFixed

P.S. Czy tam nie powinno być Math.floor dla ujemnych?
warland
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
trueblue
To pokaż jak użyłeś, bo ja bym użył tak:
  1. var coord_slug = lat.toFixed(2) + ',' + lng.toFixed(2);
warland
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
trueblue
Nie wiem jaki cudem dla 38 otrzymujesz 38.0.
https://jsfiddle.net/1sd3c61e/
trueblue
51.9,18.5
warland
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
trueblue
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.
trueblue
  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.
warland
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.
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.