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?

Slee
quelle
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.

Howard
quelle
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
kraag22
quelle
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;
}
Thomson Comer
quelle
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
Nathan Garabedian
quelle
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{

}
Muhammad Asyraf
quelle