0

これが私の状況です。何らかの理由で、コア データに保存されている注釈の座標が、マップ上のピンの位置から取得できる座標と一致していないようです。

したがって、次のような方法でデータをコア データに保存します。

[ride setLatitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.latitude]];
[ride setLongitude:[NSNumber numberWithDouble:newRidePlacemark.coordinate.longitude]];

経度と緯度を保存するのに適切な形式であると確信しています。ただし、コア データにある座標とドロップされたピンの座標を比較すると、問題が発生します。メソッドとログを使用して、ピンの位置を確認します。

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

NSLog(@"%f, %f", view.annotation.coordinate.latitude, view.annotation.coordinate.longitude);

これは私に次のようなものを与えます:

38.119432、-122.225647

しかし、同時に、そのピンのコア データに何が保存されているかを確認しています。

38.11943249695161、-122.2256469726562

その違いはどこから来たのですか?なぜ短くされたのですか?注釈を削除しようとすると、座標が一致せず、注釈が削除されないため、これは実際の問題です。

ここで何かを見逃しましたか?

4

1 に答える 1

2

doubleまず、データ フロー全体で型 (64 ビット)を使用していることを確認する必要があります。データが一時的に (32 ビット) に変換されると、float精度が失われます。バックエンド用の plist を使用してコア データに格納すると、実際には一時的にテキスト文字列などの他のデータ表現に変換される場合があります。

次に、一般に浮動小数点数を比較するときは注意が必要です。値が等しいことを比較する代わりに、必要な精度に応じていくつかの小さな違いを考慮する必要があります。

if(fabs(num1 - num2) <= 0.000001) {
// numbers are considered equal
}

お役に立てれば。

于 2010-05-27T08:31:24.740 に答える