8

不确定这是否是问这个问题的正确方法,但这就是问题所在。

给定纬度 26.746346081599476,我如何找到数字 26.75 作为数字的第 16 位和 26.6875 作为数字的第 16 位?

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

我正在使用 JavaScript,所以一个答案会很有帮助,但不是必需的。我可以暴力破解它,但我正在寻找优雅的方式来做到这一点。

更大的图景是我想为我正在开发的地图应用程序创建标准图块。我们正在使用 Bing 地图,并且每次用户平移或放大时,我都会按需加载数据。利用服务器端缓存来处理这些请求会很好,所以如果我标准化发送到服务器的查询,我会得到一些缓存命中。如果我不对服务器的请求进行标准化,那么同一个用户不太可能同时查看确切的某个位置。

因此,使用 /path/data.json?tl=26.6875,-80.6875&br=26.75,-80.75 比使用 /path/data.json?tl=26.74946187679896,-80.10930061340332&br=26.743234270702878 更有可能获得缓存命中,-80.09607195854187

也欢迎任何开箱即用的答案。

4

6 回答 6

15

要找到最接近的 1/n 倍数:

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

如果您的数字已经是 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);
于 2009-10-01T21:25:28.437 回答
9

将该值乘以 16,使用 floor 或 ceil 方法,然后除以 16:

var higher = Math.ceil(number * 16) / 16;
var lower = Math.floor(number * 16) / 16;
于 2009-10-01T21:27:37.950 回答
2

听起来像是四舍五入到最接近的 16 位……</p>

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

由于浮点表示,您可能会得到不准确的数字,但如果您仅将其用于缓存,则在您的情况下这无关紧要。

于 2009-10-01T21:29:05.687 回答
2
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
于 2009-10-01T21:43:54.063 回答
0

您有兴趣拆分的最小分数是多少?IE 16ths 会是最小的增量吗?

如果是,只需将您的数字乘以 16。将其转换为 int 并除以 16 以找到下限。将其截断为 int,加 1,然后除以 16 以找到上限。

于 2009-10-01T21:27:44.637 回答
0

到目前为止尚未发布的一些策略:

A) 创建一个查找表,将小数点后的数字映射到最接近的 16 位。只需使用您需要的任何精度(可能是百分之几)。

B)创建一个包含从 0 到 1 的所有 16 位的表,并使用您的数字 % 1 进行二进制样式搜索。

于 2009-10-01T21:29:23.057 回答