Faça um float mostrar apenas duas casas decimais

296

Eu tenho o valor 25.00em a float, mas quando imprimo na tela é 25.0000000.
Como posso exibir o valor com apenas duas casas decimais?

mskfisher
fonte
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (duplo: número))!
precisa saber é o seguinte

Respostas:

648

Não é uma questão de como o número é armazenado, é uma questão de como você o está exibindo. Ao convertê-lo em uma sequência, você deve arredondar para a precisão desejada, que no seu caso tem duas casas decimais.

Por exemplo:

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

%.02finforma ao formatador que você estará formatando um float ( %f) e, que deve ser arredondado para dois lugares e deve ser preenchido com 0s.

Por exemplo:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
fonte
7
Notei que usar% .2f realmente retorna 25,00 no seu exemplo e não 25. Isso é estranho.
fulvio 11/01
3
A maneira como eu sempre entendi foi que o número após o ponto decimal dizia quantos decimais você obteve. Portanto, .2f realmente daria 25,00 e .4f daria 25,0000.
Erik S
3
Se alguém está curioso para saber como realmente se obtém 25 ... @"%.f"faz o truque. O que está escrito acima, não .
Alex Gray
4
@acecapades, se você usar@"%.*f", decimalPlaces, number
Jonathan.
12
Provavelmente este será um off-topic parcial, mas eu gostaria de acrescentar outro formato:%03.f = 025
SoftDesigner
197

Aqui estão algumas correções -

//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 assim por diante...

Vaibhav Saran
fonte
O último é preciso? @ "%. 03f" = 3145.566? Como você conseguiu 0,566 em vez de 0,560?
Pixelfreak 6/12/11
o inteiro que determina o número de casas decimais pode ser uma variável? como @ "%. xf" onde x pode ser qualquer número inteiro?
Acecapades
Se você está tendo problemas com @ "%. F", tente @ "%. 0f". Eu encontrei este trabalhou para chegar sem casas decimais onde o outro não
simon_smiley
1
Alguém pode me dizer por que você usaria% .02f em vez de apenas% .2f?
23417 hinterbu
20

Você também pode tentar usar o NSNumberFormatter:

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

Você pode precisar também definir o formato negativo, mas acho que é inteligente o suficiente para descobrir.

Rick
fonte
você precisa deste float numTwoDecimalDigits = atof ([s UTF8String]);
Loretoparisi
10

Fiz uma extensão rápida com base nas respostas acima

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 codificação
fonte
Essa solução também parece funcionar com o CGFloat. Impressionante!
eonist
Isto é o que eu estava procurando. Obrigado companheiro!
Tushar Katyal
9

No Swift Language, se você deseja mostrar, precisa usá-lo dessa maneira. Para atribuir valor duplo no UITextView, por exemplo:

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

Se você deseja mostrar no LOG como o objetivo-c faz usando o NSLog (), em Swift Language você pode fazer o seguinte:

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

No objetivo-c, se você estiver lidando com matrizes de caracteres regulares (em vez de ponteiros para o NSString), também poderá usar:

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

OTOH, se o que você deseja é armazenar esse valor em uma matriz de caracteres, você pode usar:

sprintf(your_char_ptr, "%.02f", your_float_var);
Pablo Santa Cruz
fonte
3

O problema com todas as respostas é que multiplicar e depois dividir resulta em problemas de precisão porque você usou a divisão. Aprendi isso há muito tempo com a programação em um PDP8. A maneira de resolver isso é:

return roundf(number * 100) * .01;

Assim, 15.6578 retorna apenas 15.66 e não 15.6578999 ou algo não intencional assim.

Qual o nível de precisão que você deseja depende de você. Apenas não divida o produto, multiplique-o pelo equivalente decimal. Não é necessária nenhuma conversão engraçada de strings.

ztalbot
fonte
1

no objetivo -c é que você deseja exibir o valor flutuante em 2 números decimais e passar o argumento indicando quantos pontos decimais você deseja exibir, por exemplo, 0,02f imprimirá 25,00 0,002f imprimirá 25.000

shaunak
fonte
1

Aqui estão alguns métodos para formatar dinamicamente de acordo com uma precisão:

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

por exemplo

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

=> 2.3453

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

=> 2

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

=> 2,35 (arredondado para cima)

Ryan
fonte
Essa é uma solução muito boa, muito obrigado. Você pode me explicar como isso funciona? Vejo que você adicionou um símbolo '%' extra.
9309 Eugene Alexeev
1

Outro método para Swift (sem usar o NSString):

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

PS: esta solução não está funcionando com o tipo CGFloat testado apenas com Float&Double

Aks
fonte
1
@ Downvoter desconhecido, esta é a solução que funciona para o swift e também é diferente de outras respostas para o swift. Por que?
Aks
se você pode retornar um float você sempre pode convertê-lo para um CGFloat
eonist
1

Use NSNumberFormattercom maximumFractionDigitscomo abaixo:

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

E você terá 12.35

Allen Huang
fonte
0

Se você também precisar flutuar valor:

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