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?
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 0
s.
Par exemple.:
%f = 25.000000
%.f = 25
%.02f = 25.00
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...
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.
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
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))
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);
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.
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
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
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)
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
Si vous devez également définir une valeur flottante:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];