如何将小数舍入到最接近的分数?

时间:2009-10-01 21:17:13

标签: javascript math gis bing-maps decimal

不确定这是否是正确的问题,但这是问题。

鉴于纬度为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

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

6 个答案:

答案 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进行二进制样式搜索。

相关问题