Redondeo de números en Objective-C

Estoy tratando de redondear algunos números y convertirlos en una cadena para mejorar la salida en un progtwig 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

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

Gracias, Ash

Gracias por todos los consejos, he logrado encontrar 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]; 

Lo anterior funciona para los casos de prueba que arrojé, pero si alguien sabe una mejor manera de hacerlo, ¡estaría interesado en escucharlo!

 float floatVal = 1.23456; 

Redondeo

 int roundedVal = lroundf(floatVal); NSLog(@"%d",roundedVal); 

Redondeando

 int roundedUpVal = ceil(floatVal); NSLog(@"%d",roundedUpVal); 

Redondeando

 int roundedDownVal = floor(floatVal); NSLog(@"%d",roundedDownVal); 
 NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f]; 

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

 NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)]; 

Recomiendo examinar el uso de NSNumberFormatter .

de 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 
 NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber]; 

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

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

lo primero que se hace es redondearlo con% 0.2f y almacenarlo en NSString, luego simplemente lo convertí de nuevo en doble y el resultado fue bueno para mi cálculo.

Con estas funciones puedes redondear a cualquier valor. Si usas p = 2, obtienes 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; } 

Necesitaba poder redondear a un dígito específico (no necesariamente a enteros enteros). Hice una categoría NSNumber (basada en la respuesta de Ash ) y le agregué el siguiente método:

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

Lo que me permite usarlo así:

 [aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2]; 

Puedo usarlo para redondear a enteros pasando 0 como el segundo parámetro:

 [aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];