Arrondir la valeur double à 2 décimales

87

J'ai une valeur double comme 22,368511 Je veux l'arrondir à 2 décimales. c'est-à-dire qu'il devrait renvoyer 22,37

Comment puis je faire ça?

testndtv
la source
1
Voulez-vous renvoyer cette valeur avec 2 décimales? ou afficher la valeur avec 2 décimales?
lois du
En fait, j'ai juste besoin de l'afficher
testndtv

Réponses:

189

Comme dans la plupart des langues, le format est

%.2f

vous pouvez voir plus d'exemples ici


Edit : j'ai aussi ceci si vous êtes préoccupé par l'affichage du point dans les cas 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
la source
13
Sur iOS, j'ai dû utiliser setPositiveFormat:, car la setFormat:méthode n'existait pas (définie uniquement pour Mac), mais quand même - excellente réponse, m'a sauvé des heures d'expérimentation, donc +1 et grand merci à vous :)
FurloSK
1
Un problème: n'est pas arrondi, mais tronqué. Vraisemblablement, en utilisant la valeur d'entrée fournie par l'interrogateur avec votre code, le résultat ne serait pas ce qu'il attendait (22,37) - plutôt (22,36).
James Bush
Mais vous ne pouvez pas l'utiliser pour d'autres calculs
Parag Bafna
70

Vous pouvez utiliser le code ci-dessous pour le formater à deux décimales

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
la source
2
Dans swift 4: let str = String (décrivant: formatter.string (from: 12.2345)!)
yehyatt
Est-il possible que ne pas augmenter de 6 à 7 en valeur de résultat 22,36?
Shahbaz Akram
@ShahbazAkram Oui. Le roundingMode propose également de nombreuses autres options, par exemple NSNumberFormatterRoundDown, NSNumberFormatterRoundHalfDown etc.
Abdurrahman Mubeen Ali
30
 value = (round(value*100)) / 100.0;
krafter
la source
5
Je crois que c'est la réponse la plus correcte - il a demandé simplement de l'arrondir - de ne pas la convertir en chaîne à la fin (ou de faire une double conversion en double par la suite).
Martin Kovachev
15
[label setText:@"Value: %.2f", myNumber];
TigerCoding
la source
11

Dans Swift 2.0 et Xcode 7.2:

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

Exemple:

entrez la description de l'image ici

Claudio Guirunas
la source
11

Vous pouvez utiliser la fonction NSDecimalRound

Geek fruité
la source
cela est utile si vous arrondissez la valeur (ce que je pensais aussi être la question au début) mais les commentaires montrent que hmthur wats pour contrôler uniquement l'affichage ...
Jason Rogers
6

Pour supprimer les décimales de votre double, jetez un œil à cette sortie

Obj C

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

La sortie sera:

10.02 
10

Swift 2.1 et 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))

La sortie sera:

3.14 
3
Radu Ursache
la source
4

J'allais accepter la réponse de Jason mais j'ai remarqué que dans Ma version de Xcode (4.3.3) je ne pouvais pas faire ça. donc après un peu de recherche, j'ai découvert qu'ils avaient récemment changé les méthodes de classe et supprimé toutes les anciennes. alors voici comment je devais le faire:

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

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

Utilisez NSNumber * aNumber = [NSNumber numberWithDouble: number]; au lieu 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
la source
2

Pour Swift, il existe une solution simple si vous ne pouvez pas importer Foundation, utilisez round () et / ou ne voulez pas de String (généralement le cas lorsque vous êtes dans Playground):

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

résultat: 31.726

Paula Hasstenteufel
la source
1

J'utilise la solution publiée par Umberto Raimondi étendant le type Double:

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

Vous pouvez faire ceci:

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
la source