2009-10-01 23 views
7

これが正しいかどうかはわかりませんが、ここで問題があります。小数点以下を四捨五入する方法は?

緯度が26.746346081599476である場合、数字より26.75が数より16分の1で、26.6875が数字より16分の1であることを確認するにはどうすればよいですか?

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

ボックス外の回答も歓迎されます。

答えて

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

+0

@mobrule:Guffaよりもあなたの方法が優れている理由を教えてください。私は彼のコードが少し少ないのが好きですが、私は特別な取り扱いがここで私を助ける方法に興味があります。 – sheats

+0

あなたが境界で何をするかに応じて、 'lower_bound == upper_bound'をしたくないかもしれません。例えば、座標を描いたボックスを線形変換し、分母に '(upper_bound-lower_bound) 'という式を置いているかもしれません。 – mob

9

あなたは16で、16で値を掛ける床や切り上げメソッドを使用して、除算:

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

を使用すると、分割に興味がある最小の画分は何ですか? IEは最小の増分になる16位ですか?

の場合は、数字に16を掛けます。整数に切り捨て、下限を見つけるには16で割ります。 intにトランケートして1を加え、16で割って上限を見つけます。

1

はあなたが原因フロート表現の正確でない数字を得ることができ

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

...最寄りの16日に丸めるように聞こえるが、あなただけのキャッシュのためにそれを使用する場合、それはあなたのケースでは問題ないはず。

0

戦略のカップルは、そう遠くない投稿:

A)最寄り16日に小数点以下の桁をマップするルックアップテーブルを作成します。必要な精度(おそらく100分の1)を使用してください。

B)0から1までのすべての16thsのテーブルを作成し、自分の番号%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 
関連する問題