使用Objective C Double进行数学运算

时间:2011-04-29 02:48:29

标签: objective-c math core-graphics double

我已经在Objective C中得到了这个循环,需要一些指导才能解决问题。我试图根据数组,数组中存储为字符串的数字来计算四个条的高度。 largestTotal是一个字符串,包含数组中四个对象中最大的一个。我以前将数组中的每个元素格式化为货币。

for (int j=0; j<[array count]; j++) {    
    NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);
    double barHeight = (([[array objectAtIndex:j] doubleValue])*400.0/([biggestTotal doubleValue]));
    NSLog(@"%@",barHeight);
    CGRect currentRect = CGRectMake((150.0+(j*125.0)), (425.0-barHeight), 100.0, barHeight); // (x, y, width, height)
    CGContextAddRect(context, currentRect);
    CGContextDrawPath(context, kCGPathFillStroke);
}

使用上面的NSLog语句,我得到如下控制台输出:

0 $106,758.20 $106,758.20
(null)
1 $14,536.69 $106,758.20
(null)
2 $32,111.96 $106,758.20
(null)
3 $100,020.00 $106,758.20
(null)

另外,遗憾的是我没有酒吧。我在这里错过了什么?为什么barHeight是(null)?任何帮助都将非常感激......

3 个答案:

答案 0 :(得分:6)

barHeightNULL *,因为@"$106,758.20"没有有效的doubleValue。摆脱$, **,它应该有效。

另外,如果您使用货币进行数学运算,don't use double。使用NSDecimalNumber


*实际上0.0因为它无法转换per the docs,但是,正如其他人所指出的那样,你试图用错误的格式说明符来记录它:{{1 },用于对象,而不是%@。由于double0x0nil :),如果您尝试0x0 == 0.0,则输出为“(null)”。 同样,如果您 NSLog(@"%@", 0.0);获得有效回报,您尝试使用doubleValue很可能会导致崩溃**,因为你将试图触摸你不应该的记忆。

**感谢Caleb(见评论)指出这一点。

答案 1 :(得分:1)

NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);

你不需要[NSString stringWithFormat...]位... NSLog会为你做这件事。这样做:

NSLog(@"%@ %f", [array objectAtIndex:j], biggestTotal);

另外,请注意我使用%f而不是%@作为第二个格式说明符。这是因为largestTotal是double,而不是对象指针。 %@说明符仅用于对象。您将希望在第二个NSLog()语句中进行相同的更改。

编辑:我现在看到你说bigTotal是一个字符串,在这种情况下%@是正确的。但是,第二个NSLog()为barHeight指定%@,其中 为double,因此您仍需要修复它。你的第一个日志语句是为maximumTotal打印(null),所以我怀疑你在创建maximumTotal时遇到了一些问题。

答案 2 :(得分:1)

据我所知%@仅用于对象,当我在原始数据类型上意外使用它时,我只有问题。我只是试了一下它,它为我坠毁了。相反,我使用(双打):

NSLog(@"%lf", barHeight);

可在此处找到综合列表:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html%23//apple_ref/doc/uid/TP40004265