Arredonde o valor duplo para 2 casas decimais

87

Tenho um valor duplo de 22,368511 e quero arredondá-lo para 2 casas decimais. ou seja, deve retornar 22,37

Como eu posso fazer isso?

testndtv
fonte
1
Você deseja retornar esse valor com 2 casas decimais? ou exibir o valor com 2 casas decimais?
leis de
Na verdade, só preciso exibi-lo
testndtv

Respostas:

189

Como na maioria dos idiomas, o formato é

%.2f

você pode ver mais exemplos aqui


Edit : Eu também entendi se você estiver preocupado com a exibição do ponto em casos de 25,00

{
    NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
    [fmt setPositiveFormat:@"0.##"];
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.342]]);
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.3]]);
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.0]]);
}
2010-08-22 15:04:10.614 a.out[6954:903] 25.34
2010-08-22 15:04:10.616 a.out[6954:903] 25.3
2010-08-22 15:04:10.617 a.out[6954:903] 25
Jason Rogers
fonte
13
No iOS, eu tive que usar setPositiveFormat:, porque setFormat:método não existia (definido apenas para Mac), mas ainda - ótima resposta, me economizou horas de experimentos, então +1 e muito obrigado a vocês :)
FurloSK
1
Um problema: não é redondo, mas trunca. Presumivelmente, usando o valor de entrada fornecido pelo questionador com seu código, o resultado não seria o que ele esperava (22,37) - ao invés (22,36).
James Bush
Mas você não pode usá-lo para cálculos adicionais
Parag Bafna
70

Você pode usar o código abaixo para formatá-lo com duas casas decimais

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];
[formatter setRoundingMode: NSNumberFormatterRoundUp];

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:22.368511]];

NSLog(@"Result...%@",numberString);//Result 22.37

Swift 4:

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.roundingMode = .up

let str = String(describing: formatter.string(from: 12.2345)!)

print(str)
Saikiran K
fonte
2
Em swift 4: deixe str = String (descrevendo: formatter.string (de: 12,2345)!)
yehyatt
É possível que não aumente de 6 para 7 no valor de 22,36 do resultado?
Shahbaz Akram
@ShahbazAkram Sim. O roundingMode também tem muitas outras opções, por exemplo, NSNumberFormatterRoundDown, NSNumberFormatterRoundHalfDown etc.
Abdurrahman Mubeen Ali
30
 value = (round(value*100)) / 100.0;
krafter
fonte
5
Acredito que esta seja a resposta mais correta - ele pediu apenas para arredondar - não para convertê-la em um barbante no final (ou fazer uma dupla conversão para dobrar depois).
Martin Kovachev
15
[label setText:@"Value: %.2f", myNumber];
TigerCoding
fonte
11

Em Swift 2.0 e Xcode 7.2:

let pi:Double = 3.14159265358979
String(format:"%.2f", pi)

Exemplo:

insira a descrição da imagem aqui

Claudio Guirunas
fonte
11

Você pode usar a função NSDecimalRound

Fruity Geek
fonte
isso é útil se você arredondar o valor, (o que eu também pensei que fosse a questão no início), mas os comentários mostram que hmthur deseja controlar apenas a exibição ...
Jason Rogers
6

Para remover os decimais do seu duplo, dê uma olhada nesta saída

Obj C

double hellodouble = 10.025;
NSLog(@"Your value with 2 decimals: %.2f", hellodouble);
NSLog(@"Your value with no decimals: %.0f", hellodouble);

O resultado será:

10.02 
10

Swift 2.1 e Xcode 7.2.1

let hellodouble:Double = 3.14159265358979
print(String(format:"Your value with 2 decimals: %.2f", hellodouble))
print(String(format:"Your value with no decimals: %.0f", hellodouble))

O resultado será:

3.14 
3
Radu Ursache
fonte
4

Eu ia seguir com a resposta de Jason, mas percebi que em Minha versão do Xcode (4.3.3) não poderia fazer isso. então, depois de um pouco de pesquisa, descobri que eles haviam mudado recentemente os métodos de aula e removido todos os antigos. então aqui está como eu tive que fazer:

NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];

[fmt setMaximumFractionDigits:2];
NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.342]]);
Kit Ramos
fonte
2

Use NSNumber * aNumber = [NSNumber numberWithDouble: number]; em vez de NSNumber * aNumber = [NSNumber numberWithFloat: number];

+(NSString *)roundToNearestValue:(double)number
{
    NSNumber *aNumber = [NSNumber numberWithDouble:number];

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numberFormatter setUsesGroupingSeparator:NO];
    [numberFormatter setMaximumFractionDigits:2];
    [numberFormatter setMinimumFractionDigits:0];
    NSString *string = [numberFormatter stringFromNumber:aNumber];        
    return string;
}
Coder_A_D
fonte
2

Para o Swift, há uma solução simples se você não puder importar Foundation, use round () e / ou não quer uma String (geralmente é o caso quando você está no Playground):

var number = 31.726354765
var intNumber = Int(number * 1000.0)
var roundedNumber = Double(intNumber) / 1000.0

resultado: 31,726

Paula Hasstenteufel
fonte
1

Utilizo a solução postada por Umberto Raimondi estendendo tipo Double:

extension Double {
    func roundTo(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
Matias Masso
fonte
0

Você poderia fazer isso:

NSNumberFormatter* f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setFormat:@0.00"];

// test
NSNumber* a = @12;
NSString* s = [f stringFromNumber:a];
NSLog(@"%@", s);
Hoang Minh
fonte