J'essaie de faire des arrondis de nombres et de les convertir en chaînes pour améliorer la sortie dans un programme Objective-C.
J'ai une valeur flottante que j'aimerais arrondir au .5 le plus proche, puis l'utiliser pour définir le texte sur une étiquette.
Par exemple:
1.4 serait une chaîne de: 1.5
1.2 serait une chaîne de: 1
0.2 serait une chaîne de: 0
J'ai passé un certain temps à chercher une réponse sur Google, mais, étant un non-utilisateur d'Objective-C, je ne sais pas trop quoi chercher! Donc, j'apprécierais vraiment un pointeur dans la bonne direction!
Merci, Ash
Merci aux pointeurs de tous, j'ai réussi à trouver une solution:
float roundedValue = round(2.0f * number) / 2.0f;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:1];
[formatter setRoundingMode: NSNumberFormatterRoundDown];
NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]];
[formatter release];
Ce qui précède fonctionne pour les cas de test que j'ai lancés, mais si quelqu'un connaît une meilleure façon de procéder, je serais intéressé de l'entendre!
float floatVal = 1.23456;
Arrondi
int roundedVal = lroundf(floatVal);
NSLog(@"%d",roundedVal);
Arrondir
int roundedUpVal = ceil(floatVal);
NSLog(@"%d",roundedUpVal);
Arrondir vers le bas
int roundedDownVal = floor(floatVal);
NSLog(@"%d",roundedDownVal);
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];
Utilisez lroundf () pour arrondir un float en entier, puis convertissez-le en chaîne.
NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)];
Je vous conseillerais d'utiliser NSNumberFormatter .
un moyen simple:
float theFloat = 1.23456;
int rounded = roundf(theFloat); NSLog(@"%d",rounded);
int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp);
int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown);
// Note: int can be replaced by float
La technique suivante a fonctionné pour moi dans une application financière.
NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];
monthlyPaymentCalculated=[dd doubleValue];
self.monthlyPaymentCritical=monthlyPaymentCalculated;
ce qui est fait est d'abord arrondi avec% 0.2f et stocké dans NSString, puis converti à nouveau en double et le résultat est bon pour mon calcul.
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];
Avec ces fonctions, vous pouvez arrondir à n'importe quelle valeur. Si vous utilisez p = 2, vous obtenez des nombres pairs.
float RoundTo(float x, float p)
{
float y = 1/p;
return int((x+(1/(y+y)))*y)/y;
}
float RoundUp(float x, float p)
{
float y = 1/p;
return int((x+(1/y))*y)/y;
}
float RoundDown(float x, float p)
{
float y = 1/p;
return int(x*y)/y;
}
J'avais besoin de pouvoir arrondir à un chiffre spécifique (pas nécessairement à des entiers entiers). J'ai créé une catégorie NSNumber
(basée sur réponse de Ash ) et y ai ajouté la méthode suivante:
- (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode
toPositionRightOfDecimal:(NSUInteger)position
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:position];
[formatter setRoundingMode:roundingMode];
NSString *numberString = [formatter stringFromNumber:self];
return numberString;
}
Ce qui me permet de l'utiliser ainsi:
[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];
Je peux l'utiliser pour arrondir aux entiers en passant 0
comme deuxième paramètre:
[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];