2009-04-15 16 views
71

Sto provando a eseguire un numero di arrotondamenti e una conversione in una stringa per migliorare l'output in un programma Objective-C.Numeri di arrotondamento in Objective-C

Ho un valore float che vorrei arrotondare al più vicino .5 e quindi usarlo per impostare il testo su un'etichetta.

Ad esempio:

1.4 sarebbe una serie di: 1.5

1.2 sarebbe una serie di: 1

0.2 sarebbe una serie di: 0

ho ho passato un po 'di tempo a cercare su Google una risposta ma, essendo un noob con Objective-C, non sono sicuro di cosa cercare! Quindi, apprezzerei davvero un puntatore nella giusta direzione!

Grazie, Ash

+27

Fatta eccezione per l'aggiunta del valore a un'etichetta (che ha dichiarato come il suo intento e non effettivamente chiedendo) la sua domanda non ha nulla a che fare con cacao e tutto da fare con Obj-C –

risposta

97

Grazie per i puntatori a tutti, sono riuscito a trovare una soluzione:

float roundedValue = round(2.0f * number)/2.0f; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:1]; 
[formatter setRoundingMode: NSNumberFormatterRoundDown]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]]; 
[formatter release]; 

I lavori di cui sopra per i casi di test ho buttato a lui, ma se qualcuno conosce un modo migliore per fare questo sarei interessato a sentirlo!

+7

Se viene inviato a un campo di testo, è sufficiente collegare il formattatore al campo. – Chuck

31
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number)/2.0f]; 
24

Utilizzare lroundf() per arrotondare un float a numero intero e quindi convertire il numero intero in una stringa.

+0

Questo sembra un po 'confuso, quindi chiarisco. 'lroundf()' arrotonda un float a un intero numero e lo restituisce come intero lungo (per convertirlo in una stringa puoi usare 'stringWithFormat:'). – Daniel

11
NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)]; 
2
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber]; 
35
float floatVal = 1.23456; 

A completare

int roundedVal = lroundf(floatVal); 

NSLog(@"%d",roundedVal); 

arrotondamento

int roundedUpVal = ceil(floatVal); 

NSLog(@"%d",roundedUpVal); 

Rou nding Giù

int roundedDownVal = floor(floatVal); 

NSLog(@"%d",roundedDownVal); 
2

seguente tecnica ha lavorato per me in un'applicazione finanziaria.

NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated]; 

     monthlyPaymentCalculated=[dd doubleValue]; 

self.monthlyPaymentCritical=monthlyPaymentCalculated; 

ciò che è fatto è primo è arrotondato con il% 0.2f e conservati in NSString poi ho semplicemente convertito di nuovo in letto e il risultato è stato buono per il mio calcolo.

0

Avevo bisogno di essere in grado di arrotondare a una cifra specifica (non necessariamente a interi interi).Ho fatto una categoria NSNumber (in base al largo Ash's answer) e aggiunto il seguente metodo ad esso:

- (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode 
     toPositionRightOfDecimal:(NSUInteger)position 
{ 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setMaximumFractionDigits:position]; 
    [formatter setRoundingMode:roundingMode]; 
    NSString *numberString = [formatter stringFromNumber:self]; 
    return numberString; 
} 

Il che mi permette di usare in questo modo:

[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2]; 

posso usarlo per arrotondare in numeri interi passando 0 come secondo parametro:

[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0]; 
0

Con queste funzioni è possibile arrotondare a qualsiasi valore .. Se si utilizza p = 2, si ottiene anche i numeri.

float RoundTo(float x, float p) 
{ 
    float y = 1/p; 
    return int((x+(1/(y+y)))*y)/y; 
} 

float RoundUp(float x, float p) 
{ 
    float y = 1/p; 
    return int((x+(1/y))*y)/y; 
} 

float RoundDown(float x, float p) 
{ 
    float y = 1/p; 
    return int(x*y)/y; 
} 
3

un modo semplice:

float theFloat = 1.23456; 
int rounded = roundf(theFloat); NSLog(@"%d",rounded); 
int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp); 
int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown); 
// Note: int can be replaced by float 
Problemi correlati