2009-04-15 7 views
71

Estoy tratando de redondear algunos números y convertirlos a una cadena para mejorar la salida en un programa Objective-C.Redondeando números en Objective-C

Tengo un valor flotante que me gustaría redondear al .5 más cercano y luego usarlo para configurar el texto en una etiqueta.

Por ejemplo:

1,4 sería una cadena de: 1,5

1,2 sería una cadena de: 1

0,2 sería una cadena de: 0

he Pasé un tiempo buscando en Google una respuesta pero, siendo un novato con Objective-C, ¡no estoy seguro de qué buscar! Por lo tanto, ¡realmente agradecería un puntero en la dirección correcta!

Gracias, Ash

+27

A excepción de la adición de valor a una etiqueta (que él está declarando como su intención y en realidad no preguntar sobre) su pregunta no tiene nada que ver con cacao y todo lo relacionado con Obj-C –

Respuesta

97

Gracias por el punteros a todos, he conseguido llegar a una solución:

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]; 

Los trabajos anteriores para los casos de prueba que arrojó contra él, pero si alguien sabe una mejor manera para hacer esto, ¡estaría interesado en escucharlo!

+7

Si esto se envía a un campo de texto, simplemente puede adjuntar el formateador al campo. – Chuck

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

Utilice lroundf() para redondear un flotante a entero y luego convertir el entero en una cadena.

+0

Esto parece un poco confuso, entonces aclaro. 'lroundf()' redondea un flotador a un número entero y lo devuelve como un entero largo (para convertirlo en una cadena, puede usar 'stringWithFormat:'). – Daniel

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

Completando

int roundedVal = lroundf(floatVal); 

NSLog(@"%d",roundedVal); 

Redondeo

int roundedUpVal = ceil(floatVal); 

NSLog(@"%d",roundedUpVal); 

Rou Nding abajo

int roundedDownVal = floor(floatVal); 

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

siguiente técnica trabajó para mí en una aplicación financiera.

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

     monthlyPaymentCalculated=[dd doubleValue]; 

self.monthlyPaymentCritical=monthlyPaymentCalculated; 

lo que se hizo es primero está redondeada con% 0.2f y almacenado en NSString entonces i simplemente convertidos de nuevo en doble y el resultado fue bueno para mi cálculo.

0

Necesitaba poder redondear a un dígito específico (no necesariamente a enteros enteros).Hice una categoría NSNumber (derivado Ash's answer) y se añade el siguiente método a la misma:

- (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; 
} 

que me permite usarlo de esta manera:

[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2]; 

lo puedo usar para redondear a números enteros por pasando en 0 como segundo parámetro:

[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0]; 
0

con estas funciones se pueden completar en cualquier valor .. Si utiliza p = 2, se obtiene números pares.

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

una manera simple:

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 
Cuestiones relacionadas