Fare un float mostra solo due cifre decimali


296

Ho il valore 25.00in a float, ma quando lo stampo sullo schermo lo è 25.0000000.
Come posso visualizzare il valore con solo due cifre decimali?


var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
Kalpeshdeo,

Risposte:


648

Non è una questione di come viene memorizzato il numero, ma di come lo si sta visualizzando. Quando lo converti in una stringa devi arrotondare alla precisione desiderata, che nel tuo caso è due cifre decimali.

Per esempio:

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

%.02fdice al formattatore che formatterai un float ( %f) e, che dovrebbe essere arrotondato in due punti, e deve essere riempito con 0s.

Per esempio:

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

7
Ho notato che l'utilizzo di% .2f in realtà restituisce 25,00 nel tuo esempio e non 25. Questo è strano.
Fulvio,

3
Il modo in cui ho sempre capito era che il numero dopo il punto decimale diceva quanti decimali hai ottenuto. Quindi, .2f darebbe effettivamente 25.00 e .4f darebbe 25.0000.
Erik S

3
Se qualcuno è curioso di sapere come si ottiene effettivamente 25 ... @"%.f"fa il trucco. Ciò che è scritto sopra, no .
Alex Gray,

4
@acecapades, se usi@"%.*f", decimalPlaces, number
Jonathan.

12
Probabilmente questo sarà un parziale fuori tema ma aggiungerei un altro formato:%03.f = 025
SoftDesigner

197

Ecco alcune correzioni-

//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"

e così via...


L'ultimo è preciso? @ "%. 03f" = 3145.566? Come hai ottenuto .566 anziché .560?
pixelfreak,

l'intero che determina il numero di cifre decimali può essere una variabile? come @ "%. xf" dove x può essere qualsiasi numero intero?
acecapades,

Se riscontri problemi con @ "%. F", prova @ "%. 0f". Ho scoperto che ha funzionato per non ottenere decimali dove l'altro no
simon_smiley

1
Qualcuno può dirmi perché dovresti usare% .02f anziché solo% .2f?
hinterbu,

20

Puoi anche provare a usare NSNumberFormatter:

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

Potrebbe essere necessario impostare anche il formato negativo, ma penso che sia abbastanza intelligente da capirlo.


hai bisogno di questo float numTwoDecimalDigits = atof ([s UTF8String]);
Loretoparisi,

10

Ho fatto una rapida estensione in base alle risposte sopra

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

utilizzo:

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

Questa soluzione sembra funzionare anche con CGFloat. Eccezionale!
eonista

Questo è quello che stavo cercando. Grazie compagno!
Tushar Katyal,

9

In Swift Language, se vuoi mostrare devi usarlo in questo modo. Per assegnare un doppio valore in UITextView, ad esempio:

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

Se vuoi mostrare in LOG come obiettivo-c usando NSLog (), allora in Swift Language puoi farlo in questo modo:

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

3

IN goal-c, se hai a che fare con normali array di caratteri (anziché puntatori a NSString) puoi anche usare:

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

OTOH, se quello che vuoi è archiviare quel valore su un array di caratteri puoi usare:

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

3

Il problema con tutte le risposte è che moltiplicare e poi dividere i risultati in problemi di precisione perché hai usato la divisione. L'ho imparato molto tempo fa dalla programmazione su un PDP8. Il modo per risolverlo è:

return roundf(number * 100) * .01;

Quindi 15.6578 restituisce solo 15.66 e non 15.6578999 o qualcosa del genere non voluto.

Quale livello di precisione vuoi dipende da te. Basta non dividere il prodotto, moltiplicarlo per l'equivalente decimale. Nessuna conversione di stringa divertente richiesta.


1

nell'obiettivo -c vuoi visualizzare il valore float in 2 numeri decimali, quindi passa l'argomento che indica quanti punti decimali vuoi visualizzare ad es. 0.02f verrà stampato 25.00 0.002f verrà stampato 25.000


1

Ecco alcuni metodi per formattare dinamicamente secondo una precisione:

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

per esempio

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

=> 2.3453

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

=> 2

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

=> 2.35 (arrotondamento per eccesso)


È un'ottima soluzione, grazie mille. Puoi spiegarmi come funziona? Vedo che hai aggiunto un ulteriore simbolo '%'.
Eugene Alexeev,

1

Un altro metodo per Swift (senza usare NSString):

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

PS questa soluzione non funziona con il tipo CGFloat testato solo con Float&Double


1
@Sconosciuta downvoter questa è una soluzione funzionante per swift e anche diversa dalle altre risposte per swift, quindi perché?
Chiede

se puoi restituire un float puoi sempre convertirlo in CGFloat
eonist

1

Utilizzare NSNumberFormattercon maximumFractionDigitscome di seguito:

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

E otterrai 12.35


0

Se è necessario anche il float del valore:

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

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.