Objective c 在CoreData中设置时,双NSNumber不准确(使用RestKit)

Objective c 在CoreData中设置时,双NSNumber不准确(使用RestKit),objective-c,core-data,nsnumber,Objective C,Core Data,Nsnumber,我在CoreData对象中定义了price,将其定义为double,但是,要设置或使用price的值,我只能使用NSNumber包装器,这就是CoreData的工作方式,它很好 但我发现在设置数字时存在准确性问题 例如,我从UITextField数字输入中获得了一个双精度: [self.lineItem setPriceValue:round([_finalPrice doubleValue]*100)/100]; // This actually trivial since it is alr

我在CoreData对象中定义了price,将其定义为double,但是,要设置或使用price的值,我只能使用NSNumber包装器,这就是CoreData的工作方式,它很好

但我发现在设置数字时存在准确性问题

例如,我从UITextField数字输入中获得了一个双精度:

[self.lineItem setPriceValue:round([_finalPrice doubleValue]*100)/100]; // This actually trivial since it is already 83.99 as you see in the log but doesn't affect the result.

NSLog(@"Price to set: %@", _finalPrice);
NSLog(@"Price set: %@", [self.lineItem price]);
以下是日志:

2014-03-30 21:03:24.207 MyApp[20998:60b] Price to set: 83.99
2014-03-30 21:03:24.207 MyApp[20998:60b] Price set: 83.98999999999999
这看起来像是十进制的一个小故障,除了我在任何地方都没有真正使用十进制。有可能RestKit在某个地方使用过它,这超出了我的控制范围,但我对此表示怀疑


同时,它也在我的应用程序中引发了问题,因为它是一个商业应用程序,而我与之交谈的API的读数仅为83.9899999999,即83.98,在涉及这些有问题的数字的每一笔交易中都会造成一到两美分的损失。

浮点类型
float
double
将数字存储为二进制,并非所有的十进制分数都有一个精确的二进制分数等价物。因此,需要精确的货币计算应该使用整数类型,使用适当的单位,例如美分或便士,或者使用十进制浮点类型,如
NSDecimalNumber
提供的类型。使用哪种方法取决于需要表示的值的范围和需要执行的计算类型。

这与RestKit无关,它纯粹是关于
double
/
NSNumber
/
描述
。为什么必须将其存储为数字?您使用的API应该可以很好地处理它-如果不是,那么应该更改它…谢谢!我已将CoreData中的双精度转换为十进制,并开始使用NSDecimalNumber。谢谢你的详细解释,我遇到了同样的问题,很高兴知道正确的解决方案。