在iOS核心数据中存储高精度的纬度/经度数字

我正在尝试将纬度/经度存储在核心数据中。 这些结果是从6-20位精度的任何地方。

无论出于何种原因,我把它们作为Core Data的花车,将它们四舍五入,而不是给我确切的数值。 我试过“小数”types,没有运气。

NSStrings是我唯一的select吗?

编辑

NSManagedObject:

@interface Event : NSManagedObject { } @property (nonatomic, retain) NSDecimalNumber * dec; @property (nonatomic, retain) NSDate * timeStamp; @property (nonatomic, retain) NSNumber * flo; @property (nonatomic, retain) NSNumber * doub; 

以下是存储在核心数据中的样本编号的代码:

 NSNumber *n = [NSDecimalNumber decimalNumberWithString:@"-97.12345678901234567890123456789"]; 

上面的值打印出来。 甜,我期望的价值:

 Printing description of n: -97.12345678901234567890123456789 

代码再次访问它:

 NSNumber *n = [managedObject valueForKey:@"dec"]; NSNumber *f = [managedObject valueForKey:@"flo"]; NSNumber *d = [managedObject valueForKey:@"doub"]; 

打印值:

 Printing description of n: -97.1234567890124 Printing description of f: <CFNumber 0x603f250 [0xfef3e0]>{value = -97.12345678901235146441, type = kCFNumberFloat64Type} Printing description of d: <CFNumber 0x6040310 [0xfef3e0]>{value = -97.12345678901235146441, type = kCFNumberFloat64Type} 

你有没有使用NSNumber包装?

configuration您的商店使用NSNumber,而不是浮点数或小数点,并使用它来保存坐标:

 [NSNumber numberWithDouble:coordinate.latitude] //Same for longitude. 

尝试在Core Data中使用Double数据types。 由于您的位置坐标是双倍的,因此在Core Data中使用相同的坐标是有意义的。 虽然可能刚刚可用(iOS 5)。

当Core Data将数据存储在SQLite中时,它使用数字列。 SQLite将数字存储为 – 最多8个字节的值,无论是整数还是浮点数。 所以,尽pipeNSDecimalNumber会很高兴准确地表示这些坐标值,但是通过由SQLite支持的Core Data十进制属性将它们四舍五入将使它们陷入困境。

由于坐标范围是明确定义的,所以可以通过使用64位int表示(甚至是多个)来添加精确度的几个数字(与double相比)。

在现实中,你的来源和目标可能不会使用或提供这么多的准确性,所以…可能没有太大的收获。

我相信截断问题可能在日志上,而不是存储在Core Data中的实际数据。

你可以通过发布你正在使用的代码来确认输出吗?

我之所以这么说,是因为我注意到,当logging一些较长的NSString字段时,Core Data描述将只显示大约50个字符,这可能会导致您认为它正在截断数据,但实际上只是截断了它。

在您的数据模型编辑器中,确保纬度/长度字段的types设置为double 。 否则CoreData会为你做转换,结果将不是你所期望的(在这种情况下,小数点将被丢弃)。

强烈build议使用NSDecialNumber进行存储,如果您需要精确的值或比较你的代码。 在存储之后,您可能会得到不同的值,并从双核字段的核心数据中获取价值。