%
、モジュロ演算子ではありません。それは剰余演算子です。JavaScriptにはモジュロ演算子はありません。だから、受け入れられた答えは行く方法です。
%
、モジュロ演算子ではありません。それは剰余演算子です。JavaScriptにはモジュロ演算子はありません。だから、受け入れられた答えは行く方法です。
回答:
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
この記事からの抜粋:JavaScript Moduloバグ
x < -n
-例えば(-7 + 5) % 5 === -2
けど((-7 % 5) + 5) % 5 == 3
。
Number.prototype
プロトタイプメソッドを使用するたびに数値がにラップされるため、使用はSLOWですObject
。これの代わりに:
Number.prototype.mod = function(n) {
return ((this % n) + n) % n;
}
使用する:
function mod(n, m) {
return ((n % m) + m) % m;
}
参照:http : //jsperf.com/negative-modulo/2
プロトタイプを使用するよりも最大97%高速です。もちろんあなたにとってパフォーマンスが重要なのなら...
n
のをしてm
、あなたの第二の例@StuRで間違った方法を中心にね。それはあるはずですreturn ((n % m) + m) % m;
。
%
JavaScript の演算子は剰余演算子であり、剰余演算子ではありません(主な違いは負の数値の処理方法にあります)。
-1 % 8 // -1, not 7
remainder
、定義上、0より大きくなければなりません。高校の分割定理を思い出せませんか?だから多分あなたはここを見ることができます:en.wikipedia.org/wiki/Euclidean_division
肯定的な結果を返す「mod」関数。
var mod = function (n, m) {
var remain = n % m;
return Math.floor(remain >= 0 ? remain : remain + m);
};
mod(5,22) // 5
mod(25,22) // 3
mod(-1,22) // 21
mod(-2,22) // 20
mod(0,22) // 0
mod(-1,22) // 21
mod(-21,22) // 1
そしてもちろん
mod(-13,64) // 51
#sec-applying-the-mod-operator
にはURLのすぐそこを参照しています:)とにかく、メモをありがとう、私は私の答えから綿毛を取り除きました、それはとにかく本当に重要ではありません。
受け入れられた答えは、%演算子を再利用するため、少し緊張します。JavaScriptが将来の動作を変更した場合はどうなりますか?
%を再利用しない回避策は次のとおりです。
function mod(a, n) {
return a - (n * Math.floor(a/n));
}
mod(1,64); // 1
mod(63,64); // 63
mod(64,64); // 0
mod(65,64); // 1
mod(0,64); // 0
mod(-1,64); // 63
mod(-13,64); // 51
mod(-63,64); // 1
mod(-64,64); // 0
mod(-65,64); // 63
-
、*
、/
、;
、.
、(
、)
、,
、Math.floor
、function
またはreturn
変更?次に、コードがひどく壊れています。
私は負のaと負のnも扱います
//best perf, hard to read
function modul3(a,n){
r = a/n | 0 ;
if(a < 0){
r += n < 0 ? 1 : -1
}
return a - n * r
}
// shorter code
function modul(a,n){
return a%n + (a < 0 && Math.abs(n));
}
//beetween perf and small code
function modul(a,n){
return a - n * Math[n > 0 ? 'floor' : 'ceil'](a/n);
}
これはバグではありません。モジュロを計算する3つの関数があり、ニーズに合った関数を使用できます(ユークリッド関数の使用をお勧めします)
console.log( 41 % 7 ); // 6
console.log( -41 % 7 ); // -6
console.log( -41 % -7 ); // -6
console.log( 41 % -7 ); // 6
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
console.log( parseInt( 41).mod( 7) ); // 6
console.log( parseInt(-41).mod( 7) ); // 1
console.log( parseInt(-41).mod(-7) ); // -6
console.log( parseInt( 41).mod(-7) ); // -1
Number.prototype.mod = function(n) {
var m = ((this%n)+n)%n;
return m < 0 ? m + Math.abs(n) : m;
};
console.log( parseInt( 41).mod( 7) ); // 6
console.log( parseInt(-41).mod( 7) ); // 1
console.log( parseInt(-41).mod(-7) ); // 1
console.log( parseInt( 41).mod(-7) ); // 6
%
否定的な結果が返される可能性があります(これはこれらの関数の目的であり、修正するためです)
parseInt(-41).mod(-7)
返され-6
ます1
(そしてこれがまさに私が書いたInteger part関数の目的です)
あなたのために仕事をするNPMパッケージがあります。以下のコマンドでインストールできます。
npm install just-modulo --save
READMEからコピーした使用法
import modulo from 'just-modulo';
modulo(7, 5); // 2
modulo(17, 23); // 17
modulo(16.2, 3.8); // 17
modulo(5.8, 3.4); //2.4
modulo(4, 0); // 4
modulo(-7, 5); // 3
modulo(-2, 15); // 13
modulo(-5.8, 3.4); // 1
modulo(12, -1); // NaN
modulo(-3, -8); // NaN
modulo(12, 'apple'); // NaN
modulo('bee', 9); // NaN
modulo(null, undefined); // NaN
GitHubリポジトリは、次のリンクから入手できます。
https://github.com/angus-c/just/tree/master/packages/number-modulo
(-13) % 64
または-(13 % 64)
?個人的には、わかりやすくするために、どちらの方法でもかっこを付けました。