Według kalkulatora Google (-13) % 64
jest 51
.
Według Javascript (zobacz JSBin ) jest -13
.
Jak to naprawić?
javascript
math
modulo
Wąwóz Alec
źródło
źródło
(-13) % 64
czy-(13 % 64)
? Osobiście wstawiłbym pareny w obu kierunkach, dla większej przejrzystości.%
nie jest operator modulo. To pozostały operator. W JavaScript nie ma operatora modulo. Tak więc zaakceptowana odpowiedź jest właściwą drogą.Odpowiedzi:
Zaczerpnięte z tego artykułu: Błąd JavaScript Modulo
źródło
x < -n
- np .(-7 + 5) % 5 === -2
ale((-7 % 5) + 5) % 5 == 3
.Używanie
Number.prototype
jest POWOLNE, ponieważ za każdym razem, gdy używasz metody prototypowej, twój numer jest zawijany wObject
. Zamiast tego:Posługiwać się:
Zobacz: http://jsperf.com/negative-modulo/2
~ 97% szybciej niż przy użyciu prototypu. Jeśli wydajność jest dla Ciebie ważna, oczywiście ...
źródło
n
S im
S dookoła niewłaściwy sposób w swoim drugim przykładzie @StuR. Powinno byćreturn ((n % m) + m) % m;
.%
Operator JavaScript jest operatorem pozostała nie operator modulo (główna różnica polega na tym, w jaki sposób ujemne numery obróbce):-1 % 8 // -1, not 7
źródło
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_divisionFunkcja „mod”, która zwraca wynik dodatni.
I oczywiście
źródło
#sec-applying-the-mod-operator
do 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.Przyjęta odpowiedź trochę mnie denerwuje, ponieważ ponownie używa operatora%. Co się stanie, jeśli JavaScript zmieni zachowanie w przyszłości?
Oto obejście, które nie wykorzystuje ponownie%:
źródło
-
,*
,/
,;
,.
,(
,)
,,
,Math.floor
,function
lubreturn
zmiany? Twój kod jest strasznie zepsuty.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.
źródło
Jeśli
x
jest liczbą całkowitą in
potęgą 2, możesz użyćx & (n - 1)
zamiastx % n
.źródło
Wygląda więc na to, że jeśli próbujesz modować wokół stopni (tak, że jeśli masz -50 stopni - 200 stopni), powinieneś użyć czegoś takiego:
źródło
Mam też do czynienia z negatywnym i ujemnym n
źródło
To nie jest błąd, istnieją 3 funkcje do obliczania modulo, możesz użyć tej, która odpowiada Twoim potrzebom (polecam użyć funkcji euklidesowej)
Obcinanie funkcji części dziesiętnej
Funkcja części całkowitych
Funkcja euklidesowa
źródło
%
może zwracać negatywne wyniki (jest to celem tych funkcji, aby to naprawić)parseInt(-41).mod(-7)
wróciłbym-6
zamiast1
(i to jest dokładnie cel funkcji liczb całkowitych, którą napisałem)Istnieje pakiet NPM, który wykona pracę za Ciebie. Możesz zainstalować go za pomocą następującego polecenia.
npm install just-modulo --save
Użycie skopiowane z README
Repozytorium GitHub można znaleźć pod następującym linkiem:
https://github.com/angus-c/just/tree/master/packages/number-modulo
źródło