round redondear limitar float decimales con objective-c formatting floating-point

objective c - redondear - Hacer un flotador solo mostrar dos decimales



math.round java dos decimales (13)

Aquí hay algunas correcciones

//for 3145.559706

Swift 3

let num: CGFloat = 3145.559706 print(String(format: "%f", num)) = 3145.559706 print(String(format: "%.f", num)) = 3145 print(String(format: "%.1f", num)) = 3145.6 print(String(format: "%.2f", num)) = 3145.56 print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f" print(String(format: "%.3f", num)) = 3145.560 print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-c

@"%f" = 3145.559706 @"%.f" = 3146 @"%.1f" = 3145.6 @"%.2f" = 3145.56 @"%.02f" = 3145.56 // which is equal to @"%.2f" @"%.3f" = 3145.560 @"%.03f" = 3145.560 // which is equal to @"%.3f"

y así...

Tengo el valor 25.00 en un float , pero cuando lo 25.0000000 en la pantalla es 25.0000000 .
¿Cómo puedo mostrar el valor con solo dos decimales?


Aquí hay algunos métodos para formatear dinámicamente de acuerdo a una precisión:

+ (NSNumber *)numberFromString:(NSString *)string { if (string.length) { NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; f.numberStyle = NSNumberFormatterDecimalStyle; return [f numberFromString:string]; } else { return nil; } } + (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision { NSNumber *numberValue = [self numberFromString:string]; if (numberValue) { NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision]; return [NSString stringWithFormat:formatString, numberValue.floatValue]; } else { /* return original string */ return string; } }

p.ej

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2.3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2.35 (redondear hacia arriba)


El problema con todas las respuestas es que multiplicar y luego dividir resulta en problemas de precisión porque usó la división. Aprendí esto hace mucho tiempo de la programación en un PDP8. La forma de resolver esto es:

return roundf(number * 100) * .01;

Por lo tanto, 15.6578 devuelve solo 15.66 y no 15.6578999 o algo inesperado como eso.

El nivel de precisión que desee depende de usted. Simplemente no dividas el producto, multiplícalo por el equivalente decimal. No se requiere conversión de cadena graciosa.


En Swift Language, si desea mostrar que necesita usarlo de esta manera. Para asignar doble valor en UITextView, por ejemplo:

let result = 23.954893 resultTextView.text = NSString(format:"%.2f", result)

Si desea mostrar en LOG como lo hace object-c usando NSLog (), entonces en Swift Language puede hacerlo de esta manera:

println(NSString(format:"%.2f", result))


En object-c, si está tratando con arrays de caracteres regulares (en lugar de punteros a NSString) también podría usar:

printf("%.02f", your_float_var);

OTOH, si lo que desea es almacenar ese valor en una matriz de caracteres que podría usar:

sprintf(your_char_ptr, "%.02f", your_float_var);


Hice una extensión rápida basada en las respuestas anteriores.

extension Float { func round(decimalPlace:Int)->Float{ let format = NSString(format: "%%.%if", decimalPlace) let string = NSString(format: format, self) return Float(atof(string.UTF8String)) } }

uso:

let floatOne:Float = 3.1415926 let floatTwo:Float = 3.1425934 print(floatOne.round(2) == floatTwo.round(2)) // should be true


No se trata de cómo se almacena el número, sino de cómo se muestra. Al convertirlo en una cadena, debe redondearse a la precisión deseada, que en su caso es dos decimales.

P.ej:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02f le dice al formateador que estará formateando un flotador ( %f ) y, que se debe redondear a dos lugares, y se debe rellenar con 0 s.

P.ej:

%f = 25.000000 %.f = 25 %.02f = 25.00


Otro método para Swift (sin usar NSString):

let percentage = 33.3333 let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PD: esta solución no funciona con el tipo CGFloat solo probado con Float & Double


Si también necesitas valor flotante:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat]; float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);


También puedes intentar usar NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease]; nf.positiveFormat = @"0.##"; NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

Es posible que también debas establecer el formato negativo, pero creo que es lo suficientemente inteligente como para averiguarlo.


Utilice NSNumberFormatter con maximumFractionDigits como se muestra a continuación:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; formatter.maximumFractionDigits = 2; NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

Y obtendrás 12.35


en el objetivo -c es u desea mostrar el valor flotante en el número 2 decimal y luego pasar el argumento que indica cuántos puntos decimales u desea mostrar, por ejemplo, 0.02f se imprimirá 25.00 0.002f se imprimirá 25.000


lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];