Делать математику с целью C Double - PullRequest
1 голос
/ 29 апреля 2011

У меня есть этот цикл в Objective C, и мне нужно некоторое обучение, чтобы заставить его работать.Я пытаюсь вычислить высоту четырех баров на основе чисел, хранящихся в виде строк в массиве, массиве.gestTotal - это строка, содержащая самый большой из четырех объектов в массиве.Ранее я форматировал каждый из элементов массива как валюту.

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 (ноль)?Любая помощь будет наиболее ценной ...

Ответы [ 3 ]

6 голосов
/ 29 апреля 2011

barHeight равно NULL*, потому что @"$106,758.20" не имеет действительного doubleValue. Избавьтесь от $ и ,**, и это должно сработать.

Кроме того, если вы занимаетесь математикой с валютой, не используйте double. Используйте NSDecimalNumber


* На самом деле 0.0, потому что он не может быть конвертирован, в соответствии с документами , но затем, как все остальные указали, вы пытаетесь зарегистрировать его с неправильным спецификатором формата: %@, что для объектов, а не double. Поскольку 0x0 равно nil и 0x0 == 0.0 :), если вы попытаетесь NSLog(@"%@", 0.0);, вы получите «(ноль)» для вывода. Также , если вы делаете верный возврат от doubleValue, ваша попытка использовать %@ с большой вероятностью приведет к сбою **, потому что вы будете пытаться прикоснись к памяти, которой ты не должен.

** Кредит Калеб (см. Комментарий) за указание на это.

1 голос
/ 29 апреля 2011

Насколько я знаю, %@ используется только для объектов, и у меня не было ничего, кроме проблем, когда я случайно использовал его для примитивных типов данных. Я только попробовал это на двойном, и это разбилось для меня. Вместо этого я использую (для двойников):

NSLog(@"%lf", barHeight);

Полный список можно найти здесь:

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

1 голос
/ 29 апреля 2011
NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);

Вам не нужен бит [NSString stringWithFormat...] ... NSLog сделает это за вас.Сделайте это вместо:

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

Также обратите внимание, что я использовал% f вместо% @ в качестве второго спецификатора формата.Это потому, что bigTotal является двойным, а не указателем объекта.Спецификатор% @ предназначен только для объектов.Вы захотите внести то же изменение во второй оператор NSLog ().

Edit: Теперь я вижу, что вы говорите, чтоgestTotal - это строка, и в этом случае% @ является правильным,Тем не менее, второй NSLog () задает% @ для barHeight, который равен двойному, поэтому вам все равно придется это исправить.Ваша первая запись в журнале - это печать (null) для самого большого-общего, поэтому я подозреваю, что у вас есть какие-то проблемы, где бы вы ни создавали самое большое-общее.

...