2010-07-21 6 views
12

ich NSString alskonvertieren NSString für Berechnungen zu verdoppeln und dann wieder zurück in NSString drucken

NSString *value = [valuelist objectAtIndex:valuerow]; 
NSString *value2 = [valuelist2 objectAtIndex:valuerow2]; 

von UIPickerView akzeptieren. Ich möchte

double *cal = value + (value2 * 8) + 3; 


NSString *message =[[NSString alloc] initWithFormat:@"%@",cal]; 

sollte ich in der Lage sein, um die Zeichenfolge in Nachricht zu erhalten, nachdem ich es, die Berechnungen zu tun .. Bitte helfen Mein Programm abstürzt

Antwort

35
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal]; 
+0

Danke Jungs! Es funktionierte ! –

+1

Nun, das ist nur völlig subjektiv –

+0

Ich schaute mich um und so weit scheinen% f und% g nach den meisten Referenzen identisch zu sein. Wie sind sie anders? – jamone

1
 
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%g",cal]; 

// do work with message 

[message release]; 
2

Sie shouldn‘ t zwischen Doubles und Strings die ganze Zeit konvertieren, da es dazu neigt, Genauigkeit zu verlieren (in der Regel müssen Sie sehr vorsichtig sein, wenn Sie nicht die Genauigkeit verlieren wollen).

Zum Beispiel nextafter(1.0,2.0) gibt die kleinste Doppel größer als 1 ist (genau 1,0000000000000002220446049250313080847263336181640625, aber wir sind glücklich mit 1,0000000000000002). Formatieren mit "% g" gibt nur "1" zurück.

Wir würden erwarten, NSNumber das Richtige zu tun, aber [[NSNumber numberWithDouble:nextafter(1,2)] stringValue] gibt auch "1" zurück. Laut den Dokumenten ruft -[NSNumber stringValue][self descriptionWithLocale:nil], die es mit "% 0.16g" formatiert. Das ist nicht genug. Wir erhalten jedoch die richtige Antwort durch Formatierung mit "% .17g". Ich denke, "% .17g" ist genug, vorausgesetzt, dass Doppelgänger sind IEEE 754 64-Bit verdoppelt und die Bibliotheken funktionieren ordnungsgemäß, aber es gibt keine Garantie.

Am Ende des Tages gibt es keine Garantie, dass [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n.

+0

Danke dafür, aber ich brauchte nur bis zu 2 Dezimalstellen. Dh: 12.50 –

1

eine neue Antwort Posting, da die Sicherheiten akzeptiert, nur, dass string => double:

double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; 
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal]; 

double => string zu gehen, verwenden

double cost = [string doubleValue]; 
+0

Warum der Zeiger? Es sollte doppelt kosten = [string doubleValue]; –

+0

guter Punkt. auf einer Meta-Ebene ... Warum der Kommentar? einfach den Beitrag bearbeiten? : D – pfrank

+0

Du hast Recht :-) Bearbeitet –