To może być tylko kwestia pierwszeństwa. Masz na myśli (-13) % 64czy -(13 % 64)? Osobiście wstawiłbym pareny w obu kierunkach, dla większej przejrzystości.
Podstawowym problemem w JS %nie jest operator modulo. To pozostały operator. W JavaScript nie ma operatora modulo. Tak więc zaakceptowana odpowiedź jest właściwą drogą.
Nie wiem, czy nazwałbym to „błędem”. Operacja modulo nie jest zbyt dobrze zdefiniowana w porównaniu z liczbami ujemnymi, a różne środowiska komputerowe traktują ją inaczej. Artykuł Wikipedii na temat działania modulo całkiem dobrze to opisuje.
Może wydawać się głupi, ponieważ często nazywa się go „modulo”, co sugeruje, że zachowałby się tak samo, jak jego definicja matematyczna (zob. Algebra ℤ / nℤ), co nie.
Świetna wskazówka. Wziąłem twój jsperf i porównałem z pozostałymi rozwiązaniami w tym pytaniu (ale wydaje się, że i tak jest najlepsze): jsperf.com/negative-modulo/3
Mikrooptymalizacja. Aby to zmienić, musisz wykonać ogromną liczbę modyfikacji modów. Koduj, co jest najczystsze i najbardziej łatwe w utrzymaniu, a następnie zoptymalizuj następującą analizę wydajności.
Motywacja podana w tej odpowiedzi to mikrooptymalizacja, tak, ale modyfikacja prototypu jest problematyczna. Preferuj podejście z najmniejszymi skutkami ubocznymi, którym jest ten.
@DaveKennedy: MDN nie jest oficjalnym odniesieniem do języka, jest to strona edytowana przez społeczność, która czasem się myli. Specyfikacja nie nazywa go operatorem modulo i, o ile mogę stwierdzić, nigdy nie miała (wróciłem do ES3). Wyraźnie mówi, że operator podaje pozostałą część domniemanego podziału, i po prostu nazywa to „operatorem%”.
Jeśli jest wywoływany remainder, z definicji musi być większy niż 0. Nie pamiętasz twierdzenia o podziale z liceum ?! Więc może zajrzyj tutaj: en.wikipedia.org/wiki/Euclidean_division
MDN nie jest oficjalnym odniesieniem do języka, jest to strona edytowana przez społeczność, która czasem się myli. Specyfikacja nie nazywa go operatorem modulo i, o ile mogę stwierdzić, nigdy nie miała (wróciłem do ES3). Wyraźnie mówi, że operator podaje pozostałą część dorozumianego podziału i po prostu nazywa to „operatorem%”.
Ups, podany link faktycznie odwołuje się #sec-applying-the-mod-operatordo adresu URL :) W każdym razie, dzięki za notatkę, usunąłem puch z mojej odpowiedzi, to i tak nie jest tak naprawdę ważne.
„Co, jeśli JavaScript zmieni zachowanie w przyszłości?” - Dlaczego miałby to zrobić? Zmiana zachowania takiego podstawowego operatora jest mało prawdopodobna.
+1 za podzielenie się tą troską i alternatywą wobec przedstawionej odpowiedzi # answer-4467559 i z 4 powodów: (1) Dlaczego stwierdza, i tak „Zmiana zachowania tak fundamentalnej operacji jest mało prawdopodobna”, ale nadal rozważnie rozważa nawet aby znaleźć to nie jest potrzebne. (2) zdefiniowanie działającego op w kategoriach zepsutego, choć imponujące, jest niepokojące przynajmniej na pierwszy rzut oka, nie powinno być pokazane, dopóki (3) nie dobrze sprawdziłem tę alternatywę, uważam, że łatwiej jest naśladować Szybkie spojrzenie. (4) malutki: używa 1 div + 1 mul zamiast 2 (mod) div i słyszałem na DUŻO wcześniejszym sprzęcie bez dobrego FPU, mnożenie było szybsze.
@DestinyArchitect nie jest ostrożny, nie ma sensu. Jeśli mieliby zmienić zachowanie pozostałego operatora, zepsułoby to dobry zakres programów, które go wykorzystują. To się nigdy nie wydarzy.
Chociaż nie zachowuje się tak, jak się spodziewałeś, nie oznacza to, że JavaScript nie zachowuje się. Jest to JavaScript wybierany do obliczeń modulo. Ponieważ z definicji każda odpowiedź ma sens.
Zobacz to z Wikipedii. Po prawej stronie widać, jak różne języki wybrały znak wyniku.
//best perf, hard to readfunction modul3(a,n){
r = a/n |0;if(a <0){
r += n <0?1:-1}return a - n * r
}// shorter codefunction modul(a,n){return a%n +(a <0&&Math.abs(n));}//beetween perf and small codefunction modul(a,n){return a - n *Math[n >0?'floor':'ceil'](a/n);}
napisałeś ten [kod] Number.prototype.mod = funkcja (n) {var m = ((ten% n) + n)% n; zwrócić m <0? m + Math.abs (n): m; }; [/ code] daj mi jedną wartość n, gdzie m jest ujemne. nie mają wartości n, gdzie m jest ujemne, ponieważ dodajesz n po pierwszym%.
ha ok, masz rację, wszystkie moje przeprosiny, zapomniałem negatywnego modulo, myślałem tylko o „tym” negatywnym. Czy mogę zasugerować przeniesienie Math.abs Number.prototype.mod = function (n) {return ((this% n) + Math.abs (n))% n; }; (-41) .mod (-7) == 1 // nie trzeba
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
(-13) % 64
czy-(13 % 64)
? Osobiście wstawiłbym pareny w obu kierunkach, dla większej przejrzystości.