web-dev-qa-db-fra.com

Faire un flotteur montrer seulement deux décimales

J'ai la valeur 25.00 dans un float, mais lorsque je l’imprime à l’écran, il s’agit de 25.0000000.
Comment puis-je afficher la valeur avec seulement deux décimales?

293
ron

Il ne s'agit pas de savoir comment le numéro est stocké, mais comment vous l'affichez. Lors de la conversion en chaîne, vous devez arrondir à la précision souhaitée, qui est dans votre cas deux décimales.

Par exemple.:

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

%.02f indique au formateur que vous allez formater un float (%f) et qu'il doit être arrondi à deux endroits et complété avec 0s.

Par exemple.:

%f = 25.000000
%.f = 25
%.02f = 25.00
642
Andrew Grant

Voici quelques corrections-

//for 3145.559706

Swift

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"

etc...

192
Vaibhav Saran

Vous pouvez aussi essayer d’utiliser NSNumberFormatter:

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

Vous devrez peut-être également définir le format négatif, mais je pense que c'est assez intelligent pour le comprendre.

20
Rick

J'ai créé une extension Swift en fonction des réponses ci-dessus.

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

usage:

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

En Swift Language, si vous voulez montrer, vous devez l'utiliser de cette façon. Pour affecter une double valeur dans UITextView, par exemple:

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

Si vous voulez afficher dans LOG comme le fait objectif-c en utilisant NSLog (), alors dans Swift Language vous pouvez le faire de la manière suivante:

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

Dans objectif-c, si vous utilisez des tableaux de caractères normaux (au lieu de pointeurs vers NSString), vous pouvez également utiliser:

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

OTOH, si ce que vous voulez est de stocker cette valeur sur un tableau de caractères, vous pouvez utiliser:

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

Le problème avec toutes les réponses est que multiplier puis diviser entraîne des problèmes de précision parce que vous avez utilisé la division. J'ai appris cela depuis longtemps en programmant sur un PDP8. La façon de résoudre ceci est:

return roundf(number * 100) * .01;

Ainsi, 15,6578 ne renvoie que 15,66 et non 15,6578999 ou quelque chose d'inattendu comme ça.

Quel niveau de précision que vous voulez est à vous. Il suffit de ne pas diviser le produit, le multiplier par l’équivalent décimal. Aucune conversion de chaîne amusante requise.

3
ztalbot

Une autre méthode pour Swift (sans utiliser NSString):

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

P.S. cette solution ne fonctionne pas avec le type CGFloat testé uniquement avec Float & Double

1
Aks

Utilisez NSNumberFormatter avec maximumFractionDigits comme ci-dessous:

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

Et vous aurez 12.35

1
Allen Huang

Voici quelques méthodes pour formater dynamiquement selon une précision:

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

par exemple.

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

=> 2.3453

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

=> 2

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

=> 2,35 (arrondir)

1
Ryan

dans l’objectif -c, vous voulez afficher une valeur flottante en deux nombres décimaux, puis passer un argument indiquant le nombre de points décimaux à afficher, par exemple 0,02f sera imprimé 25,00 0,002f sera imprimé 25 000

1
shaunak

Si vous devez également définir une valeur flottante:

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