Hacer un flotador solo muestra dos decimales

296

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

mskfisher
fuente
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
kalpeshdeo

Respuestas:

648

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

%.02fle dice al formateador que formateará un float ( %f) y que debe redondearse a dos lugares y debe rellenarse con 0s.

P.ej:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
fuente
77
Noté que usar% .2f en realidad devuelve 25.00 en su ejemplo y no 25. Esto es extraño.
fulvio
3
La forma en que siempre entendí fue que el número después del punto decimal decía cuántos decimales obtuviste. Entonces, .2f daría 25.00, y .4f daría 25.0000.
Erik S
3
Si alguien tiene curiosidad sobre cómo uno realmente consigue 25 ... @"%.f"hace el truco. Lo que está escrito arriba, no .
Alex Gray
44
@acecapades, si usas@"%.*f", decimalPlaces, number
Jonathan.
12
Probablemente sea un tema parcial, pero agregaría otro formato:%03.f = 025
SoftDesigner
197

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í...

Vaibhav Saran
fuente
¿Es el último exacto? @ "%. 03f" = 3145.566? ¿Cómo obtuviste .566 en lugar de .560?
pixelfreak
¿Puede el entero que determina el número de decimales ser una variable? como @ "%. xf" donde x puede ser cualquier número entero?
acecapades
Si tiene problemas con @ "%. F", intente con @ "%. 0f". Descubrí que esto funcionaba para no obtener decimales donde el otro no lo hacía
simon_smiley
1
¿Alguien puede decirme por qué usaría% .02f en lugar de solo% .2f?
hinterbu
20

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.

Almiar
fuente
necesita este flotante numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi
10

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
ritmo de codificación
fuente
Esta solución también parece funcionar con CGFloat. ¡Increíble!
eonista
Esto es lo que estaba buscando. ¡Gracias amigo!
Tushar Katyal
9

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))
imti
fuente
3

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);
Pablo Santa Cruz
fuente
3

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.

ztalbot
fuente
1

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

shaunak
fuente
1

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)

Ryan
fuente
Esa es una muy buena solución, muchas gracias. ¿Me puedes explicar cómo funciona? Veo que has agregado el símbolo '%' adicional.
Eugene Alexeev
1

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

Aks
fuente
1
@ Votante desconocido: esta es una solución funcional para Swift y también es diferente de otras respuestas para Swift, ¿por qué?
Aks
si puede devolver un flotador, siempre puede convertirlo en un CGFloat
eonist
1

Usar NSNumberFormattercon maximumFractionDigitslo siguiente:

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

Y obtendrás 12.35

Allen Huang
fuente
0

Si también necesita un valor flotante:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
loretoparisi
fuente
0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Rinju Jain
fuente