2009-10-01 154 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