2009-10-01 22 views
7

Nie jestem pewien, czy to jest właściwy sposób, aby zapytać o to czy nie, ale tutaj jest problem.Jak zaokrąglić liczbę dziesiętną do najbliższej ułamka?

Biorąc pod uwagę szerokość geograficzną 26,746346081599476, jak mogę znaleźć liczbę 26,75 jako 16 większą od liczby i 26.6875 jako 16 niższą od liczby?

26.0 
26.0625 
26.125 
26.1875 
26.25 
26.3125 
26.375 
26.4375 
26.5 
26.5625 
26.625 
26.6875 
My Number: 26.746346081599476 
26.75 
26.8125 
26.875 
26.9375 
27.0 

Używam JavaScript, więc odpowiedź w tym byłaby pomocna, ale nie konieczna. Mogę to brutalnie wymusić, ale szukam eleganckiego sposobu na zrobienie tego.

Im większy obrazek, chcę utworzyć standardowe kafelki dla aplikacji do mapowania, nad którą pracuję. Używamy map Bing i ładuję dane na żądanie, za każdym razem, gdy użytkownik patrzy lub przybliża. Dobrze byłoby skorzystać z buforowania po stronie serwera dla tych żądań, więc jeśli standaryzuję zapytania wysyłane na serwer, otrzymam niektóre trafienia w pamięci podręcznej. Jeśli nie ustandaryzuję żądań do serwera, jest bardzo mało prawdopodobne, że ten sam użytkownik będzie wyświetlał dokładną lokalizację w tym samym czasie.

więc istnieje większe szanse na uzyskanie cache uderza z: /path/data.json?tl=26.6875,-80.6875 & br = 26,75, -80.75 niż: /path/data.json?tl = 26.74946187679896, -80.10930061340332 & br = 26,743234270702878, -80.09607195854187

Wszystkie odpowiedzi spoza zestawu są mile widziane.

Odpowiedz

14

znaleźć najbliższy wielokrotności 1/N:

lower_bound = 1.0/n * Math.floor(n * your_number); 
upper_bound = 1.0/n * Math.ceil(n * your_number); 

Możesz użyć jakiegoś specjalnego traktowania, jeśli liczba jest już wielokrotnością 1/16.

// alternate solution so that lower_bound <= your_number < upper_bound 
lower_bound = 1.0/n * Math.floor(n * your_number); 
upper_bound = 1.0/n * Math.floor(n * your_number + 1.0); 
+0

beat mnie do niego.Prawie udało mi się to zrobić w PowerShellu i zawsze potykałem się dookoła :) – Joey

+0

@mobrule: Czy możesz mi powiedzieć, dlaczego twoja droga jest lepsza niż Guffa? Podoba mi się, że jego kod jest trochę mniejszy, ale interesuje mnie, jak może mi tu pomóc specjalna obsługa. – sheats

+0

W zależności od tego, co robisz z granicami, możesz nie chcieć pozwolić 'lower_bound == upper_bound'. Na przykład możesz przeprowadzić liniową transformację pola, które narysowałeś wokół współrzędnych, i możesz mieć wyrażenie z '(upper_bound - lower_bound)' w jakimś denominatorze. – mob

9

pomnożyć wartość o 16, używać głosu lub metody odgórnie, i podzielić przez 16:

var higher = Math.ceil(number * 16)/16; 
var lower = Math.floor(number * 16)/16; 
0

Jaka jest najmniejsza frakcje są Państwo zainteresowani podziału? IE to 16. najmłodsze kroki?

Jeśli tak, po prostu pomnóż swoją liczbę przez 16. Skróć ją do wartości int i podziel przez 16, aby znaleźć dolną granicę. Skróć ją do int, dodaj 1, a następnie podziel przez 16, aby znaleźć górną granicę.

1

Brzmi jak zaokrąglanie do najbliższego 16 ...

rounded = Math.round(number * 16)/16; 

Można uzyskać numery, które nie są dokładne, ponieważ reprezentacji pływaka, ale to nie powinno mieć znaczenia w przypadku, jeśli używasz go tylko do buforowania .

0

Kilka strategii nie pisał do tej pory:

A) utworzyć tabelę przeglądową, która odwzorowuje cyfr po przecinku do najbliższego 16. Wystarczy użyć dowolnej precyzji, jakiej potrzebujesz (prawdopodobnie setnych).

B) utworzyć spis wszystkich 16ths od 0 do 1, a nie binarny szukanie stylu z numerem% 1.

1
function bounds(number, numerator, denominator) { 
    var frac = denominator/numerator; 
    return { 
    lower: Math.floor(frac * number)/frac, 
    upper: Math.ceil(frac * number)/frac, 
    } 
} 


bounds(26.746346081599476,1,16) 
// returns an object with properties 
// lower : 26.6875 
// upper : 26.75 
Powiązane problemy