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

Asche
quelle
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!

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

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


quelle
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)];
Simpu
quelle
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
Lal Krishna
quelle
2
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];
Vladimirs Matusevics
quelle
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.

ProgrammingNinja
quelle
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];
Stunner
quelle
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;
}
JJussi
quelle