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