Rundungszahlen in Ziel-C


74

Ich versuche, eine Zahlenrundung und Konvertierung in eine Zeichenfolge durchzuführen, um die Ausgabe in einem Objective-C-Programm zu verbessern.

Ich habe einen Gleitkommawert, den ich auf die nächste 0,5 runden und dann verwenden möchte, um den Text auf einer Beschriftung festzulegen.

Zum Beispiel:

1.4 wäre eine Zeichenfolge von: 1.5

1.2 wäre eine Zeichenfolge von: 1

0,2 wäre eine Zeichenfolge von: 0

Ich habe eine Weile bei Google nach einer Antwort gesucht, aber als Neuling bei Objective-C bin ich mir nicht sicher, wonach ich suchen soll! Ich würde mich also sehr über einen Zeiger in die richtige Richtung freuen!

Danke, Ash


27
Abgesehen davon, dass er einem Etikett den Wert hinzufügt (was er als seine Absicht deklariert und nicht wirklich fragt), hat seine Frage nichts mit Kakao zu tun und alles was mit Obj-C zu tun hat
Jason Coco

Antworten:


100

Vielen Dank für die Hinweise an alle, ich habe es geschafft, eine Lösung zu finden:

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

Das Obige funktioniert für die Testfälle, die ich darauf geworfen habe, aber wenn jemand einen besseren Weg dazu kennt, wäre ich interessiert, es zu hören!


7
Wenn dies in ein Textfeld ausgegeben wird, können Sie den Formatierer einfach an das Feld anhängen.
Chuck

38
float floatVal = 1.23456;

Rundung

int roundedVal = lroundf(floatVal); 

NSLog(@"%d",roundedVal);

Aufrunden

int roundedUpVal = ceil(floatVal); 

NSLog(@"%d",roundedUpVal);

Abrunden

int roundedDownVal = floor(floatVal);

NSLog(@"%d",roundedDownVal);

32
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];

24

Verwenden Sie lroundf (), um einen Float in eine Ganzzahl zu runden und die Ganzzahl dann in eine Zeichenfolge umzuwandeln.


Das scheint ein bisschen verwirrend, also kläre ich. lroundf()rundet einen Float auf eine ganze Zahl und gibt ihn als lange Ganzzahl zurück (um ihn in eine Zeichenfolge umzuwandeln, die Sie verwenden können stringWithFormat:).
Daniel

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


6

ein einfacher Weg:

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


2

Die folgende Technik arbeitete für mich in einer Finanzanwendung.

 NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];

        monthlyPaymentCalculated=[dd doubleValue];

self.monthlyPaymentCritical=monthlyPaymentCalculated;

Zuerst wurde es mit% 0.2f gerundet und in NSString gespeichert. Dann habe ich es einfach wieder in double konvertiert und das Ergebnis war gut für meine Berechnung.


1

Ich musste in der Lage sein, auf eine bestimmte Ziffer zu runden (nicht unbedingt auf ganze ganze Zahlen). Ich habe eine NSNumberKategorie erstellt (basierend auf Ashs Antwort ) und die folgende Methode hinzugefügt:

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

Was mir erlaubt, es so zu benutzen:

[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];

Ich kann es verwenden, um auf ganze Zahlen zu runden, indem ich 0als zweiten Parameter übergebe:

[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];

1

Mit diesen Funktionen können Sie auf einen beliebigen Wert runden. Wenn Sie p = 2 verwenden, erhalten Sie gerade Zahlen.

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.