Objective c 用目标C做数学

Objective c 用目标C做数学,objective-c,math,core-graphics,double,Objective C,Math,Core Graphics,Double,我在目标C中有这个循环,需要一些指导来实现它。我试图根据数组中存储为字符串的数字来计算四条线的高度。biggestTotal是一个字符串,包含数组中四个对象中最大的一个。我以前将数组中的每个元素格式化为货币 for (int j=0; j<[array count]; j++) { NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);

我在目标C中有这个循环,需要一些指导来实现它。我试图根据数组中存储为字符串的数字来计算四条线的高度。biggestTotal是一个字符串,包含数组中四个对象中最大的一个。我以前将数组中的每个元素格式化为货币

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);
}
而且,很遗憾,我没有酒吧。我错过了什么?为什么酒吧高度是a(空)?任何帮助都将不胜感激

NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);
您不需要
[NSString stringWithFormat…]
位。。。NSLog会帮你做到这一点。改为这样做:

NSLog(@"%@ %f", [array objectAtIndex:j], biggestTotal);
另外,请注意,我使用了%f而不是%@作为第二个格式说明符。这是因为biggestTotal是一个双精度指针,而不是一个对象指针。%@说明符仅用于对象。您将希望在第二条NSLog()语句中进行相同的更改

编辑:我现在明白了,你说biggestTotal是一个字符串,在这种情况下%@是正确的。但是,第二个NSLog()为barHeight指定了%@值,这是一个双精度值,因此您仍然需要修复它。您的第一个日志语句是为biggestTotal打印(null),因此我怀疑您在创建biggestTotal的任何地方都会遇到一些问题

您不需要
[NSString stringWithFormat…]
位。。。NSLog会帮你做到这一点。改为这样做:

NSLog(@"%@ %f", [array objectAtIndex:j], biggestTotal);
另外,请注意,我使用了%f而不是%@作为第二个格式说明符。这是因为biggestTotal是一个双精度指针,而不是一个对象指针。%@说明符仅用于对象。您将希望在第二条NSLog()语句中进行相同的更改


编辑:我现在明白了,你说biggestTotal是一个字符串,在这种情况下%@是正确的。但是,第二个NSLog()为barHeight指定了%@值,这是一个双精度值,因此您仍然需要修复它。您的第一个日志语句是为biggestTotal打印(null),因此我怀疑您在创建biggestTotal的任何地方都会遇到一些问题。

barHeight
null
*因为
@“$106758.20”
没有有效的
双值。去掉
$
**这两个词,它应该会起作用

另外,如果你在用货币做数学题。使用


*实际上是
0.0
,因为它无法转换,但正如其他人指出的那样,您试图使用错误的格式说明符来记录它:
%@
,它用于对象,而不是
double
。由于
0x0
nil
,并且
0x0==0.0
:),如果您尝试
NSLog(@“%@”,0.0),则输出为“(null)”同样,如果您确实从
doubleValue
中获得了有效的返回值,您尝试使用
%@
很可能会导致崩溃**,因为您将尝试触摸不应该触摸的内存


**(请参见评论)指出了这一点。由于
@“$106758.20”
没有有效的
双倍值,因此
的高度
NULL
*。去掉
$
**这两个词,它应该会起作用

另外,如果你在用货币做数学题。使用


*实际上是
0.0
,因为它无法转换,但正如其他人指出的那样,您试图使用错误的格式说明符来记录它:
%@
,它用于对象,而不是
double
。由于
0x0
nil
,并且
0x0==0.0
:),如果您尝试
NSLog(@“%@”,0.0),则输出为“(null)”同样,如果您确实从
doubleValue
中获得了有效的返回值,您尝试使用
%@
很可能会导致崩溃**,因为您将尝试触摸不应该触摸的内存


**(请参阅注释)指出了这一点,这是值得赞扬的。

据我所知,
%@
仅用于对象,当我意外地在基本数据类型上使用它时,我遇到了问题。我刚在双人床上试了一下,它就给我摔坏了。相反,我使用(双打):

可在此处找到一个全面的列表:


据我所知,
%@
仅用于对象,当我意外地在基本数据类型上使用它时,除了遇到问题外,我什么都没有。我刚在双人床上试了一下,它就给我摔坏了。相反,我使用(双打):

可在此处找到一个全面的列表:


至少对于记录barHeight,使用
NSLog(@“%f”,barHeight)。请参阅。(从回答移动到注释)
(空)
是因为您使用
%@
打印了
双精度
。由于C调用约定,它打印
(null)
,但这可能完全是巧合(它很可能是任何垃圾值,在这种情况下,您的程序就会崩溃)。您需要使用
%f
%g
打印双精度。编程要点:不要存储格式化数据,只在显示时格式化数据。这有助于避免此类问题,并允许更容易的国际化。至少对于记录barHeight,请使用
NSLog(@“%f”,barHeight)。请参阅。(从回答移动到注释)
(空)
是因为您使用
%@
打印了
双精度
。由于C调用约定,它打印
(null)
,但这可能完全是巧合(它很可能是任何垃圾值,在这种情况下,您的程序就会崩溃)。您需要使用
%f
%g
打印双精度。编程要点:不要存储格式化数据,只在显示时格式化数据。这有助于避免类似的问题,并允许更容易的国际化。他正在尝试转换
@“$106758.20”
,即前面带有美元符号的字符串,使用
doubleValue
。对,您是+1美元。我也不确定-doubleValue是否支持逗号。这里需要一个数字格式化程序。但是如果OP解决了这个问题
NSLog(@"%lf", barHeight);