web-dev-qa-db-fra.com

Arrondir les nombres dans Objective-C

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

73
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!

98
Ash
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);
37
Durai Amuthan.H
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];
32
keremk

Utilisez lroundf () pour arrondir un float en entier, puis convertissez-le en chaîne.

24
Osos
NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)];
11
Simpu

Je vous conseillerais d'utiliser NSNumberFormatter .

8
hbw

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
5
Lal Krishna

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.

2
ProgrammingNinja
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];
2

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

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];
0
Stunner