我正在尝试将纬度/经度存储在核心数据中。这些最终会达到6-20位精度。
无论出于何种原因,我把它们作为核心数据中的浮点数,将它们四舍五入,并没有给我准确的值。我试过“十进制”类型,也没有运气。
NSStrings是我唯一的另一种选择吗?
修改的
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}
答案 0 :(得分:10)
您是否使用过NSNumber包装器?
将商店配置为使用NSNumber而不是float或decimal,并使用它来保存坐标:
[NSNumber numberWithDouble:coordinate.latitude]
//Same for longitude.
答案 1 :(得分:1)
尝试在Core Data中使用Double数据类型。由于您的位置坐标是双精度数,因此在核心数据中使用相同的位置是有意义的。虽然现在可以使用(iOS 5)。
答案 2 :(得分:1)
当Core Data在SQLite中存储数据时,它使用数字列。 SQLite stores numbers as - 最多 - 8字节值,无论是整数还是浮点。因此,虽然NSDecimalNumber
非常乐意准确地表示这些坐标值,但是通过SQLite支持的核心数据十进制属性对它们进行四舍五入将使它们变得非常好。
答案 3 :(得分:0)
由于坐标范围是明确定义的,因此您可以使用64位int表示(甚至多次)来添加几位精度(与double相比)。
实际上,您的来源和目标可能无法使用或提供如此高的准确度,因此......可能没有多大好处。
答案 4 :(得分:0)
我认为截断问题可能在于日志记录,而不是存储在Core Data中的实际数据。
您可以通过发布用于记录输出的代码来确认吗?
我这样说是因为我注意到在记录我的一些较长的NSString字段时,Core Data描述只会显示约50个字符左右,这可能会让你认为它正在截断数据,但它实际上只是截断对它的描述。
答案 5 :(得分:0)
在数据模型编辑器中,确保lat / long字段的类型设置为double
。否则CoreData将为您进行转换,结果将不是您所期望的(在这种情况下,小数将被删除)。
答案 6 :(得分:0)
如果您需要精确值或在代码中进行比较,强烈建议使用NSDecialNumber进行存储。存储后可能会有不同的值,并从双字段中的核心数据中获取值。