Domanda

Non sono sicuro che questo sia il modo giusto per chiedere questo o no, ma ecco il problema.

Data una latitudine di 26.746346081599476, come faccio a trovare il numero 26,75 come 16 ° in più rispetto al numero e 26.6875 come il 16 ° inferiore al numero?

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

Sto usando JavaScript, quindi una risposta sarebbe utile ma non necessaria. Potrei bruto forzarlo, ma sto cercando il modo elegante per farlo.

L'immagine più grande è che voglio creare piastrelle standard per un'applicazione di mappatura su cui sto lavorando. Stiamo usando mappe bing e sto caricando i dati su richiesta, ogni volta che l'utente panoramica o ingrandisce. Sarebbe bello sfruttare la memorizzazione nella cache late Alcuni colpi di cache. Se non standardizzo le richieste al server, è altamente improbabile che lo stesso utente visualizzerebbe la posizione esatta contemporaneamente.

Quindi c'è una possibilità più elevata di ottenere colpi di cache con: /path/data.json?tl=26.6875,-80.6875&br=26.75,-80.75 che con: /path/data.json?tl=26.74946187679896 , -80.09607195854187

Anche le risposte fuori dagli schemi sono benvenute.

È stato utile?

Soluzione

Per trovare i multipli più vicini di 1/n:

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

Potresti voler utilizzare un po 'di gestione speciale se il tuo numero è già un multiplo di 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);

Altri suggerimenti

Moltiplichi il valore per 16, usi il metodo del pavimento o del soffitto e dividi per 16:

var higher = Math.ceil(number * 16) / 16;
var lower = Math.floor(number * 16) / 16;
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

Sembra arrotondare al 16 ° posto più vicino ...

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

Potresti ottenere numeri che non sono esatti a causa della rappresentazione del galleggiante, ma non dovrebbe importare nel tuo caso se lo usi solo per la memorizzazione nella cache.

Quali sono le frazioni più piccole che sei interessato a dividere? Cioè i sedicesimi saranno i più piccoli incrementi?

Se sì, semplicemente moltiplica il tuo numero per 16. Trunc esso in un int e dividi per 16 per trovare il limite inferiore. Trunc esso su un int, aggiungi 1, quindi dividi per 16 per trovare il limite superiore.

Un paio di strategie non pubblicate finora:

A) Crea una tabella di ricerca che mappa le cifre dopo il decimale al 16 ° più vicino. Basta usare qualsiasi precisione di cui hai bisogno (probabilmente centesimi).

B) Crea una tabella di tutti i 16 anni da 0 a 1 e fai una ricerca in stile binario con il tuo numero % 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top