Sul*_*van 2 core-data objective-c nsnumber
我已经定义的价格在我的CoreData对象的LineItem是一个双,但设置或使用的价值的价格,我只能用NSNumber的包装,这是CoreData是如何工作的,它只是罚款.
但是我在设置数字时发现了准确性问题.
例如,我有一个来自UITextField数字输入的double:
[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]);
Run Code Online (Sandbox Code Playgroud)
这是日志:
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
Run Code Online (Sandbox Code Playgroud)
这看起来像那些小数小故障之一,除了我没有真正使用过小数的事实.RestKit有可能在某处使用它,这是我无法控制的,但我对此表示怀疑.
同时它在我的应用程序中引起问题,因为它是一个商业应用程序,我与之交谈的API只读取83.98999999999999为83.98,在每个涉及这些有问题的数字的交易中造成一两次折扣.
二进制而不是所有小数部分的浮点类型float和double存储数具有精确的二进制分数等价.因此,需要精确的货币计算应该使用整数类型,使用适当的单位,例如美分或便士,或者使用十进制浮点类型,例如由提供的NSDecimalNumber.选择使用取决于您需要表示的值的范围以及您需要执行的计算类型.
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |