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?


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

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)

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;

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


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


11

Você pode usar a função NSDecimalRound


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

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

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

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


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
    }
}

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.