De acordo com o Google Calculator (-13) % 64
é 51
.
De acordo com o Javascript (veja este JSBin ) é -13
.
Como faço para corrigir isso?
javascript
math
modulo
Alec Gorge
fonte
fonte
(-13) % 64
ou-(13 % 64)
? Pessoalmente, eu colocaria os parênteses de qualquer maneira, apenas para maior clareza.%
não é o operador do módulo. É o operador restante. Não há operador de módulo em JavaScript. Portanto, a resposta aceita é o caminho a percorrer.Respostas:
Retirado deste artigo: The JavaScript Modulo Bug
fonte
x < -n
- por exemplo,(-7 + 5) % 5 === -2
mas((-7 % 5) + 5) % 5 == 3
.O uso
Number.prototype
é LENTO, porque cada vez que você usa o método prototype, seu número é envolvido em umObject
. Em vez disso:Usar:
Veja: http://jsperf.com/negative-modulo/2
~ 97% mais rápido do que usar protótipo. Se o desempenho é importante para você, é claro ..
fonte
n
s em
s em torno da maneira errada em seu segundo exemplo @StuR. Deveria serreturn ((n % m) + m) % m;
.O
%
operador em JavaScript é o operador restante, não o operador de módulo (a principal diferença está na maneira como os números negativos são tratados):-1 % 8 // -1, not 7
fonte
remainder
, deve ser maior que 0 por definição. Você não consegue se lembrar do teorema da divisão do ensino médio ?! Então, talvez você possa dar uma olhada aqui: en.wikipedia.org/wiki/Euclidean_divisionUma função "mod" para retornar um resultado positivo.
E claro
fonte
#sec-applying-the-mod-operator
ali no URL :) De qualquer forma, obrigado pela observação, tirei o cotão da minha resposta, não é realmente importante de qualquer maneira.A resposta aceita me deixa um pouco nervoso porque reutiliza o operador%. E se o Javascript mudar o comportamento no futuro?
Aqui está uma solução alternativa que não reutiliza%:
fonte
-
,*
,/
,;
,.
,(
,)
,,
,Math.floor
,function
oureturn
mudanças? Então seu código está terrivelmente quebrado.Embora não esteja se comportando como o esperado, isso não significa que o JavaScript não esteja 'se comportando'. É uma escolha feita pelo JavaScript para o cálculo do módulo. Porque, por definição, qualquer resposta faz sentido.
Veja isso na Wikipedia. Você pode ver à direita como diferentes idiomas escolheram o sinal do resultado.
fonte
Se
x
é um número inteiro en
é uma potência de 2, você pode usar emx & (n - 1)
vez dex % n
.fonte
Portanto, parece que se você estiver tentando modificar graus (de modo que se você tiver -50 graus - 200 graus), deseje usar algo como:
fonte
Eu lido com o negativo A e negativo também
fonte
Isso não é um bug, existem 3 funções para calcular o módulo, você pode usar o que se adapta às suas necessidades (eu recomendaria o uso da função euclidiana)
Truncar a função da parte decimal
Função de peça inteira
Função euclidiana
fonte
%
pode retornar resultados negativos (um este é o propósito dessas funções, para corrigi-lo)parseInt(-41).mod(-7)
voltaria-6
em vez de1
(e este é exatamente o propósito da função de parte Integer eu escrevi)Há um pacote NPM que fará o trabalho para você. Você pode instalá-lo com o seguinte comando.
npm install just-modulo --save
Uso copiado do README
O repositório do GitHub pode ser encontrado através do seguinte link:
https://github.com/angus-c/just/tree/master/packages/number-modulo
fonte