2009-10-01 151 views
7

不知道这是否是正确的方式来问这个问题,但这里是问题所在。如何将小数点四舍五入到最接近的分数?

给定纬度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,因此在这方面的答案会有所帮助,但不是必需的。我可以蛮力,但我正在寻找优雅的方式来做到这一点。

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

因此,有越来越缓存的机会较高与点击: /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

任何盒子外面的答案,欢迎为好。

回答

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); 
+0

打我给它。我几乎在PowerShell中工作,并总是偶然发现:) – Joey 2009-10-01 21:27:20

+0

@mobrule:你能告诉我为什么你的方式比Guffa的更好吗?我喜欢他的代码少一点,但我对特殊处理如何帮助我在这里感兴趣。 – sheats 2009-10-02 15:44:34

+0

根据您对界限所做的操作,您可能不想让'lower_bound == upper_bound'。例如,您可能会对围绕坐标绘制的框执行一些线性转换,并且您可能在某个分母的某个分母中有一个带有“(upper_bound - lower_bound)'的表达式。 – mob 2009-10-02 16:26:20

9

您可以通过16乘以值,使用由16楼或小区方法,并分:

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

什么是你感兴趣的分裂最小的分数? IE是16位将是最小的增量?

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

1

听起来像四舍五入到最接近的16 ...

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

你可以让那些不准确的,因为浮点表示的数字,但如果你使用它只是缓存不应该在你的情况下,重要。

0

一对夫妇的策略没有发布至今:

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

B)创建所有的16份表从0到1,做一个二进制风格的搜索与你的电话号码%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