NSNumber数组之和的准确性

时间:2014-10-31 09:01:24

标签: ios objective-c double nsnumber floating-accuracy

我有一个NSNumber数组(在这种情况下,为简单起见,我只有一个元素)

阵列是" _incassiInDistinta"包含一个对象" Incasso"它有一个属性" _importoIncassato"

enter image description here

现在如果我使用这个

double sum = [[_incassiInDistinta valueForKeyPath:@"@sum.importoIncassato"] doubleValue];

变量" sum"我的价值如下:

enter image description here

如果您通过此方法运行求和变量" sum"就是这样:

NSArray *importi = [_incassiInDistinta valueForKeyPath:@"importoIncassato"];
__block double sum = 0;
[importi enumerateObjectsUsingBlock:^(NSNumber *op, NSUInteger idx, BOOL *stop) {
    sum = sum + [op doubleValue];
}];

enter image description here

如何获得正确的值? 感谢

编辑:

我必须在if

中比较sum变量

if(sum> = 1373.63).....

不起作用

2 个答案:

答案 0 :(得分:1)

您的差异只是浮动值的二进制近似值,您的两个结果之间大约1e-13并不担心。一篇关于浮点表示的文章here

如果您确实需要精确的十进制数(例如货币),则可以使用NSDecimalNumber。但只有在必要时才使用它们,它们会使一切变慢。

答案 1 :(得分:0)

这是我用于上述问题的黑客攻击。

double转换为NSString并向上舍入到小数点后两位。

然后再次将其从double转换为NSString。这将为您提供所需的结果。试试吧。

NSString *roundUp = [NSString stringWithFormat:@"%0.2f",sum];

double finalValue = [roundUp doubleValue];

double fixValue = 1373.63;

if (finalValue == fixValue) {
    NSLog(@"Both values are same");
}