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