Jit*_*ngh 1 core-data objective-c nsdecimalnumber
我对存储在核心数据中的十进制数有疑问。当我将数字 0.6789 保存到数据库中时,它被保存为 0.6788999999999999。
我在某处读到建议将十进制数列作为十进制数以保持精度,因为核心数据会自动处理核心数据中十进制列的 NSDecimalNumber。
下面是我的实体类:
@interface TestEntity : NSManagedObject
@property (nonatomic, retain) NSDecimalNumber * cost;
@end
@implementation TestEntity
@dynamic cost;
@end
Run Code Online (Sandbox Code Playgroud)
这是我插入数据的方式:
TestEntity *envelope = [NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
envelope.cost = [NSDecimalNumber decimalNumberWithString:@"0.6789"];
[self.managedObjectContext save:nil];
Run Code Online (Sandbox Code Playgroud)
请有人帮助我,插入数据库时我应该如何处理十进制数及其精度?
核心数据由 SQLite 支持。根据SQLite 文档, SQLite 仅支持高达64 位的整数和具有64 位 IEEE 754格式(double在目标 C 中)的浮点数。因此精度仅限于这些类型,整数约为 18.75 位有效数字,浮点数约为 15.75 位。
通常 a doubleorint64_t适用于大多数应用程序,除了那些需要超过 15-18 个有效数字的精度。在某些司法管辖区,银行机构必须依法以高精度存储十进制数,并且为此使用特殊类型。
如果您的应用程序是标准的,我会使用int64_t或double。如果您使用NSDecimalNumber它,它将被 SQLite 引擎存储为 64 位类型(浮点或整数,取决于小数部分的存在)。这意味着您的精度将被限制在 15-18 位。
如果你想使用NSDecimalNumber它的高精度算法,你仍然会被限制在 15/18 位,但如果你的动态范围可以表示为 15/18 位数字(带小数部分或没有)。
如果您的动态范围更大,则NSDecimalNumber提供 38 位数字。为了将其存储在 Core Data SQLite 支持的持久存储中并能够维护 38 位数字,您应该将其转换为字符串,来回转换,以便将其作为字符串存储在 Core Data 中。您可以NSManagedObject使用几种方法在您的子类上创建一个类别,以将数字存储(编码)和检索(解码)为字符串。模型中的基础属性应该是字符串,而不是数字。
NSDecimalNumber有两种方法-stringValue并-initWithString:为您进行转换。您只需要在您的自定义类别中构建两个依赖于这些的方法。
总之:
double15 位有效数字int64_t18 位有效数字NSDecimalNumber38 位有效数字(转换为字符串以存储在 CoreData 中)| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |