2010-07-21 15 views
12

Accetto NSString comeConvertire NSString di raddoppiare per i calcoli e poi di nuovo per la stampa in NSString

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

da UIPickerView. Voglio

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


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

dovrei essere in grado di ottenere la stringa nel messaggio dopo che faccio i calcoli su di esso .. Si prega di aiutare Il mio programma si blocca

risposta

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

Thankyou Guys! Ha funzionato ! –

+1

Ora che è completamente soggettivo –

+0

mi sono guardato intorno e finora% f e% g sembrano essere identici secondo la maggior parte dei riferimenti. Come sono differenti? – jamone

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

// do work with message 

[message release]; 
2

non dovreste' t converti continuamente tra doppi e archi, dato che tende a perdere precisione (in generale, devi essere molto prudente se non vuoi perdere precisione).

Ad esempio, nextafter(1.0,2.0) restituisce il doppio più piccolo maggiore di 1 (esattamente 1.0000000000000002220446049250313080847263336181640625, ma siamo contenti di 1.0000000000000002). La formattazione con "% g" restituisce semplicemente "1".

Ci aspetteremmo NSNumber a fare la cosa giusta, ma [[NSNumber numberWithDouble:nextafter(1,2)] stringValue] restituisce anche "1". Secondo i documenti, -[NSNumber stringValue] chiama [self descriptionWithLocale:nil] che lo formatta con "% 0.16g". Questo non è abbastanza. Tuttavia, otteniamo la risposta corretta formattando con "% .17g". Penso che "% .17g" sia sufficiente purché i doppi siano IEEE 754 a 64 bit e le librerie funzionino correttamente, ma non c'è garanzia.

Alla fine della giornata, non è possibile garantire che [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n.

+0

Grazie per questo, ma ho solo bisogno di fino a 2 posti decimali .. vale a dire: 12.50 –

1

Inviare una nuova risposta dal momento che quella accettata solo fa stringa => doppia:

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

Per Go Double => string, utilizzare

double cost = [string doubleValue]; 
+0

perché il puntatore? Dovrebbe essere double cost = [string doubleValue]; –

+0

buon punto. su un meta livello ... perché il commento? basta modificare il post? : D – pfrank

+0

Hai ragione :-) Modificato –

Problemi correlati