Teilen Sie int's und runden Sie in Objective-C auf


69

Ich habe 2 Ints. Wie teile ich eins durch das andere und runde danach auf?


12
Es ist eine sehr grundlegende Frage, aber sie ist legitim. Ganzzahldivision verhält sich nicht immer so, wie man es erwarten würde.
Jonathan Grynspan

3
Ich weiß, dass es ziemlich lahm klingt, aber ich kämpfe mit den verschiedenen Objective-C-Datentypen, die durch das automatische Casting in .net
Slee

Antworten:


203

Wenn Ihre Ints Aund sind Bund Sie Ceil (A / B) haben möchten, berechnen Sie einfach (A+B-1)/B.


1
Ich habe es schon oft so gesehen. Es ist ein gutes Muster, an das man sich erinnert.
Ferruccio

1
Ich denke nicht, dass dies in allen Fällen funktioniert. (6 + 2 - 1) / 2 = 3,5, was, da es sich um Ints handelt, 3 ist, das nicht wie in der Frage aufgerundet aufgerundet wird. Die Antwort sollte in diesem Fall 4 sein.
odyth

35
@odyth: 6 geteilt durch 2 ist 3.
user1122069

Sie teilen jedoch nicht 6 und 2, weil Sie sie addieren und 1 subtrahieren müssen. Also (6 + 2-1) / 2 => (8-1) / 2 => 7/2 = 3,5
odyth

@odyth: in Integer Arithmetics 3.5 ist 3. und natürlich will OP nur bei Bedarf runden - was ist nicht der Fall für 6/2 = 3 = (6 + 2 - 1) / 2 => True
vikingosegundo

37

Wie wäre es mit:

float A,B; // this variables have to be floats!
int result = floor(A/B); // rounded down
int result = ceil(A/B); // rounded up

1
Funktioniert sicher nicht für zwei Ints? Weil die Division ein int-Ergebnis zurückgibt. Aber für zwei Floats, die in int konvertieren (was ich gerade brauchte), ist dies richtig.
Adam

Vielen Dank für den Hinweis, dass A und B schweben müssen! hat mich gerettet
Mona

4
-(NSInteger)divideAndRoundUp:(NSInteger)a with:(NSInteger)b
{
  if( a % b != 0 )
  {
    return a / b + 1;
  }
  return a / b;
}

2
Da Bools in dieser Sprache immer noch 0/1 sind, können Sie einfach haben:return a / b + (a % b != 0)
iisystems

Beachten Sie, dass, obwohl dieser Fall in Ordnung ist, BOOLs nicht unbedingt 1 und 0 sind. Sie sind "0" und "nicht 0"
James Webster

@ Howards Lösung mag effizienter und mathematisch einfacher sein, aber ich mag diese Lösung mehr. Die Absicht und Methodik ist für diejenigen von uns Programmierern klarer, die in Bedingungen und Verzweigungsberechnungen denken, nicht in algebraischer Äquivalenz. ;-)
Slipp D. Thompson

4

Wie in C können Sie das Ergebnis mit einer Rundungsfunktion, die einen Float als Eingabe verwendet, sowohl in Float als auch in Round umwandeln.

int a = 1;
int b = 2;

float result = (float)a / (float)b;

int rounded = (int)(result+0.5f);
i

2
Keine Notwendigkeit zu werfen, um zu schweben - es gibt einfachere und einfachere Lösungen nur für Ganzzahlen - siehe @ Howards Antwort zum Beispiel
Paul R

Guter Punkt - ich habe den Teil "Aufrunden" verpasst. Howard ist eine sehr elegante Lösung +1
Nathan Garabedian

0

Wenn Sie nach 2.1 Zusammenfassung suchen> 3

double row = _datas.count / 3;
double rounded = ceil(_datas.count / 3);
if(row > rounded){
    row += 1;
}else{

}
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.