Respuestas:
No se trata de cómo se almacena el número, se trata de cómo lo está mostrando. Al convertirlo en una cadena, debe redondear 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 formateará un float ( %f
) y que debe redondearse a dos lugares y debe rellenarse con 0
s.
P.ej:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
... @"%.f"
hace el truco. Lo que está escrito arriba, no .
@"%.*f", decimalPlaces, number
%03.f = 025
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í...
También puede intentar usar NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Es posible que también necesite establecer el formato negativo, pero creo que es lo suficientemente inteligente como para descubrirlo.
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
En Swift Language, si desea mostrar, debe usarlo de esta manera. Para asignar un valor doble en UITextView, por ejemplo:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Si desea mostrar en el REGISTRO como ocurre con Objective-c usando NSLog (), en Swift Language puede hacerlo de esta manera:
println(NSString(format:"%.2f", result))
EN el objetivo c, si está tratando con matrices 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);
El problema con todas las respuestas es que multiplicar y luego dividir resulta en problemas de precisión porque usaste 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 no deseado como ese.
El nivel de precisión que desea depende de usted. Simplemente no divida el producto, multiplíquelo por el equivalente decimal. No se requiere conversión de cadena divertida.
Aquí hay algunos métodos para formatear dinámicamente de acuerdo con 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)
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
Usar NSNumberFormatter
con maximumFractionDigits
lo siguiente:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
Y obtendrás 12.35
Si también necesita un valor flotante:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];