java a operacja dzielenia modulo

1

dlaczego gdy robię operację np -1 % 5 zwraca mi wartość -1 ?

z tego co pamiętam z ALGEBRY takie równanie powinno mieć wynik 4.

w każdym razie na pewno reszta jest dodatnia. Trochę to nie ładne :(

0

Bo tak jest to zdefiniowane. Przecież 4 = -1 (mod 5), więc w czym problem?

Jeżeli bardzo Cię to martwi to dodaj do wyniku 5 (czy N w ogólnym przypadku).

EDIT:
BTW. Tak jest nie tylko w Javie.

0

Ja pamiętam (z podstawówki) wzór dzielna=dzielnik*iloraz+reszta. Pamiętam (też z podstawówki), że reszta jest >=0. Tylko, że dla liczb ujemnych nie da się spełnić obu tych warunków jednocześnie.
dzielna=-1, dzielnik=5, iloraz=dzielna/dzielnik=0 => reszta=-1.
Są uzasadnione powody by -1/5 było równe -1 (w Javie tak nie jest).
Wtedy -1%5 byłoby (zgodnie z Twoimi oczekiwaniami) równe 4, ale wiele osób by wydziwiało, że 1/5=0, natomiast -1/5=-1.

1

Wytlumacznie jest bardzo proste :
operacja modulo daje reszte z dzielenia :
5%5=0; //brak reszty
6%5=1; //5*1+1 reszta 1 jak widzimy
-1%5=-1; // 5 sie ani razu nie miesci w -1 wiec zwraca -1
podobny przyklad :
3%155=3; // 155 ani razu nie zmiescisz w 3 wiec zwraca Ci Twoja trojke, ktora jesr tak naprawde reszta, czesci calkowitej nie ma wcale

155%3=2; // 3 miesci sie 51 razy w 155 ale zostaje reszta 2 --> 51*3+2 gdzie 2 to reszta ktora Ci zwraca a 51 to czesc calkowita ale jej nie wyswietla

-9%5=-4; // reszta modulo jest tego samego znaku co Twoja liczba a wiemu ze (-)*(+) daje (-).

Mam nadzieje, ze pompglam troche.

0

Komu? Autor zadał pytanie 3,5 roku temu. A obie odpowiadające osoby wiedzą zapewne o reszcie znacznie więcej niż Ty.

0
bogdans napisał(a):

Komu? Autor zadał pytanie 3,5 roku temu. A obie odpowiadające osoby wiedzą zapewne o reszcie znacznie więcej niż Ty.

ONE byc moze wiedza wiecej niz ja, ale TY na bank NIE
Pozwole sobie Ciebie zacytowac :
"Są uzasadnione powody by -1/5 było równe -1 (w Javie tak nie jest). " --> i pozwole sobie Ciebie poprawic, w jawie jest dokladnie tak (-1%5)=-1
chlopak pytal o modulo (%) w Javie, a nie o dzielenie zwykle "/" , byc moze nie przeczytales dokladnie. Zdarza sie !

ps."Komu ?" --> byc moze innym, ktorzy tutaj zajrza.

0
bogdans napisał(a):

Komu? Autor zadał pytanie 3,5 roku temu. A obie odpowiadające osoby wiedzą zapewne o reszcie znacznie więcej niż Ty.

Poza tym jak chcesz doradzac i przypominac wiedze z podstawowki, to wyjasnij mu dokladniej dzielenie "/" na int, int/double i specyfike modulo.
On pytal o modulo wiec nie mieszaj opowiesciami wigilijnymi.

0

Są uzasadnione powody by -1/5 było równe -1 (w Javie tak nie jest). " --> i pozwole sobie Ciebie poprawic, w jawie jest dokladnie tak (-1%5)=-1

W którym miejscu mnie poprawiasz? Dostrzegasz różnicę między -1/5 a -1%5?
Poza tym autor nie pytał ile to jest -1%5, ale wyrażał zdziwienie, że to jest równe -1. Uważał, że reszta jest zawsze >=0. Więc przypomniałem znane jeszcze z podstawówki zasady: dzielna = dzielnikiloraz + reszta, oraz reszta należy do przedziału [0,iloraz-1]. Zasady te obowiązują (nie tylko w podstawówce) dla liczb >=0 (dzielnik musi być >0). Ja pisałem, że dla liczb ujemnych nie da się zachować tych zasad, z jednej trzeba zrezygnować. Jeśli dzielna = -1, a dzielnik = 5, to dostajemy wzór: -1 = 5iloraz + reszta. Coś trzeba wybrać, albo zachowujemy zasadę, że reszta jest z przedziału [0,4], wtedy iloraz -1/5 musi być -1. Mogli twórcy Javy tak wybrać, wtedy obowiązywałyby dość dziwne reguły, że 1/5 = 0 oraz (-1)/5 = -1. Przy naturalnym wyborze: -1/5 = 0 dostajemy, że -1%5 = -1.
Ty starasz się uzasadnić, że reguły przyjęte w Javie są oczywiste. A tak nie jest, twórcy języka dokonali wyboru. Jeżeli mamy jakąś liczbę dodatnią n, to n % 5 == (n-1) % 5 oraz n/5 = (n-1)/5 + 1 o ile liczba n-1 jest również dodatnia. Dość naturalne jest oczekiwanie, że te wzory będą obowiązywać dla wszystkich liczb n, a tak nie jest (przynajmniej w javie). Są języki, w których tak jest.

0

Komu?...

Mi. Pomógł i za to mu dziękuję bo jasno i na temat. A hejterom dziękujemy.

0

I mi też. Wyjaśnione pięknie i zrozumiale. Dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1