2017-10-10 11 views
-3

私は以下の機能を持っており、doubleのパラメータを変更することはできません。精度を損なうことなくdoubleを関数パラメータとして使用するにはどうすればよいですか?

double latitude = coordinate.x; 
double longitude = coordinate.y; 
createEPoint(latitude, longitude)); 

VARSの緯度と経度は小数点以下の多数(35.94777225005756)を有し、そしてIは、その精度を維持する必要があります。私はBigDecimalまたは他のクラスを使用することができることを知っていますが、私はcreateEPoint(double lat, double lon)のパラメータを変更することはできません。

これで、EPointのパラメータを取得すると、緯度と経度の値が自動的に丸められます。これを回避し、数値の精度を保つためのアイデアはありますか?

+1

まあ、倍精度が失われた場合は、パラメータの型を変更するだけでなく、そのことについて多くのことを行うことはできません。 – Thomas

+0

これは、@Deprecatedアノテーションが便利なときです。したがって、メソッドのオーバーロードを検討してください。 –

+4

ダブルスを受け入れる必要がある場合は、すでに遅すぎます。二重から来た時よりも精度を上げる魔法の方法はありません。 – khelwood

答えて

2

35.94777225005756に最も近い倍数は35.94777225005756093878517276607453823089599609375で、Double.toStringの結果、デフォルトの出力は35.94777225005756です。

10進数から倍精度への変換には精度の損失があり、それを回復することはできません。 BigDecimal座標を使用して、ポイントの2番目の表現を保存して持ち歩く必要があります。

しかし、実際の位置が10進 - 2進変換のおおよその精度である1e15で1つの部分に測定されたことはほとんどありません。変数名で示唆されているように、これが40,075キロメートルの円周上の位置に対する角度である場合、精度の損失はミクロンよりもはるかに小さくなります。

関連する問題