0

这是我的情况。出于某种原因,我保存在核心数据中的注释坐标似乎与我可以从地图上的引脚位置检索到的坐标不匹配。

因此,我使用以下方法将数据保存到核心数据中:

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

我非常肯定这是保存 long 和 lat 的正确格式。但是,当我将核心数据中的坐标与放置的 pin 的坐标进行比较时,问题就出现了。我使用该方法和日志来查看引脚的位置:

- (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 位)。如果数据暂时转换为float(32 位),您将失去精度。如果您将核心数据存储在后端的 plist 中,您实际上可能会将其临时转换为其他数据表示形式,例如文本字符串。

其次,一般比较浮点数时应该小心。而不是比较值是否相等,您应该根据您想要的精度允许一些微小的差异,例如

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

希望这可以帮助。

于 2010-05-27T08:31:24.740 回答