Podział całkowity z zaokrągleniem.
tylko 1 podział wykonywany za połączenie, nie %
lub *
lub konwersji do/z zmiennoprzecinkowych, pracuje dla dodatniego i ujemnego int
. Patrz uwaga (1).
n (numerator) = OPs myIntNumber;
d (denominator) = OPs myOtherInt;
Poniższe podejście jest proste. int
runda dywizji w kierunku 0. Dla ujemnych kwot, jest to zaokrąglenie w górę, więc nic specjalnego nie jest potrzebne. Aby uzyskać dodatnie ilorazy, dodaj d-1
, aby wykonać zaokrąglenie, a następnie wykonaj podział bez znaku.
Uwaga (1) Typowy podział według 0
wysadza w powietrze i MININT/-1
zawiedzie zgodnie z oczekiwaniami na maszynach drugiego stopnia.
int IntDivRoundUp(int n, int d) {
// If n and d are the same sign ...
if ((n < 0) == (d < 0)) {
// If n (and d) are negative ...
if (n < 0) {
n = -n;
d = -d;
}
// Unsigned division rounds down. Adding d-1 to n effects a round up.
return (((unsigned) n) + ((unsigned) d) - 1)/((unsigned) d);
}
else {
return n/d;
}
}
[Edycja: Kod testu usunięta, zobacz wcześniej rev jako potrzebne źródło]
wątpię ktoś ma zamiar przedstawić rozwiązanie, które jest mniej brzydki. To, co masz, jest najbardziej czytelnym sposobem na zrobienie tego. Zaczekaj, w rzeczywistości nie używasz literałów w swoim prawdziwym kodzie? Jeśli tak, to po prostu ustaw je jako literały zmiennoprzecinkowe. W przeciwnym razie, odlewanie jest drogą do zrobienia. –
Powinieneś użyć 'double' zamiast' float', chyba że masz pewność, że nigdy nie będziesz mieć liczb większych niż 16777216. – celtschk
@ yes123 nie chcę ci przeszkadzać, ale co masz na myśli przez elegancki, twój jest bardzo łatwy do przeczytania, ale te, które zamieściłem, mogą być bardziej mathy i być może szybsze. – aaronman