不确定这是否是正确的问题,但这是问题。
鉴于纬度为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
我们也欢迎任何开箱即用的答案。
答案 0 :(得分:14)
找到最接近的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);
答案 1 :(得分:9)
您将该值乘以16,使用floor或ceil方法,并除以16:
var higher = Math.ceil(number * 16) / 16;
var lower = Math.floor(number * 16) / 16;
答案 2 :(得分: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
答案 3 :(得分:1)
听起来像四舍五入到最接近的第16位......
rounded = Math.round(number * 16) / 16;
由于浮动表示,您可能会得到不准确的数字,但如果您仅将其用于缓存,那么这在您的情况下无关紧要。
答案 4 :(得分:0)
您有兴趣分裂的最小分数是多少? IE是第16个最小的增量?
如果是,只需将您的数字乘以16.将其截断为int并除以16以找到下限。将其截断为int,加1,然后除以16以找到上限。
答案 5 :(得分:0)
到目前为止尚未发布的一些策略:
A)创建一个查找表,将小数点后的数字映射到最接近的16位。只需使用你需要的任何精度(可能是百分之一)。
B)创建一个从0到1的所有16位的表格,并使用数字%1进行二进制样式搜索。