2011-02-07 8 views
66

Mam 2 int. Jak podzielić jeden po drugim, a następnie zaokrąglić później?Podziel int i zaokrąglij w Objective-C

+12

Jest to bardzo proste pytanie, ale jest to uzasadnione; Dzielenie liczb całkowitych nie zawsze zachowuje się tak, jak można się spodziewać. –

+3

Wiem, że brzmi to dość kiepsko, ale walczę z różnymi typami danych celu, zepsutymi automatycznym castingiem, jaki możesz zrobić w .net – Slee

Odpowiedz

196

Jeśli twój ints to A i B, a chcesz mieć sufit (A/B), po prostu obliczyć (A+B-1)/B.

+2

Najlepsza odpowiedź - gdybym miał dzisiaj jakieś głosy, to byłbym "+ 1". –

+1

Widziałem to wiele razy. To dobry wzór do zapamiętania. – Ferruccio

+0

To jest na miejscu. – Jack

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

ponieważ boole wciąż są 0/1 w tym języku, możesz po prostu mieć: 'return a/b + (a% b! = 0)' – iisystems

+0

Pamiętaj, że chociaż ten przypadek jest dobry, BOOLs niekoniecznie 1 i 0 Są to "0" i "nie 0" –

+0

@ Rozwiązanie Howarda może być bardziej wydajne i matematycznie prostsze, ale bardziej podoba mi się ten soltion. Intencja i metodologia są jaśniejsze dla tych z nas, programistów, którzy myślą w kategoriach warunków i obliczeń rozgałęzień, a nie algebraicznej równoważności. ;-) –

3

jak w C, można oddać zarówno do pływania, a potem okrągły wynik stosując funkcję zaokrąglania, która przyjmuje pływaka jako wejście.

int a = 1; 
int b = 2; 

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

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

Nie ma potrzeby rzutowania na float - są prostsze i łatwiejsze rozwiązania tylko dla liczb całkowitych - patrz odpowiedź @ Howarda na przykład –

+0

Dobra uwaga - przegapiłem część "zaokrąglania". Howard's jest bardzo eleganckim rozwiązaniem +1 –

34

Co o:

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

Z pewnością nie działa na dwie części? Ponieważ podział zwróci wynik int. Ale w przypadku dwóch zmiennych, konwersja na int (co jest właśnie teraz potrzebne), jest poprawna. – Adam

+0

tak, to prawda. Poprawiłem moją odpowiedź, aby było bardziej zrozumiałe – kraag22

0

Jeśli szukasz 2,1 łapanki> 3

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

} 
Powiązane problemy