Göre Google Hesap (-13) % 64
olduğunu 51
.
Javascript'e göre (bakınız bu JSBin ) -13
.
Bunu nasıl düzeltirim?
%
modulo operatörü değildir. Kalan operatör. JavaScript'te modulo operatörü yok. Bu yüzden kabul edilen cevap yoludur.
Göre Google Hesap (-13) % 64
olduğunu 51
.
Javascript'e göre (bakınız bu JSBin ) -13
.
Bunu nasıl düzeltirim?
%
modulo operatörü değildir. Kalan operatör. JavaScript'te modulo operatörü yok. Bu yüzden kabul edilen cevap yoludur.
Yanıtlar:
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
Bu makaleden alınmıştır: JavaScript Modulo Hatası
x < -n
- örneğin (-7 + 5) % 5 === -2
ama ((-7 % 5) + 5) % 5 == 3
.
Kullanımı Number.prototype
her zaman size sayı sarılır prototip yöntemi kullanmak çünkü YAVAŞ olduğunu Object
. Bunun yerine:
Number.prototype.mod = function(n) {
return ((this % n) + n) % n;
}
kullanın:
function mod(n, m) {
return ((n % m) + m) % m;
}
Bkz. Http://jsperf.com/negative-modulo/2
Prototip kullanmaya göre ~% 97 daha hızlı. Performans elbette sizin için önemliyse ..
n
s ve m
ikinci örnek @StuR yanlış bir yol etrafında s. Olmalı return ((n % m) + m) % m;
.
%
JavaScript operatör kalan operatör değil, modülo operatörü (ana fark nasıl muamele negatif sayılar olan) olduğu:
-1 % 8 // -1, not 7
remainder
, tanım olarak 0'dan büyük olmalıdır. Liseden bölünme teoremini hatırlamıyor musunuz ?! Belki burada bir göz atabilirsiniz: en.wikipedia.org/wiki/Euclidean_division
Olumlu bir sonuç döndürmek için bir "mod" işlevi.
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
Ve tabi ki
mod(-13,64) // 51
#sec-applying-the-mod-operator
url'de referans veriyor :) Her neyse, not için teşekkürler, tüylerimi cevabımdan çıkardım, yine de gerçekten önemli değil.
Kabul edilen cevap beni biraz tedirgin ediyor çünkü% operatörünü yeniden kullanıyor. Javascript gelecekte davranışı değiştirirse ne olur?
% Yeniden kullanmayan bir geçici çözüm aşağıdadır:
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
veya return
değişikliklerin? O zaman kodunuz çok bozuk.
Beklediğiniz gibi davranmasa da, JavaScript'in 'davranış' olmadığı anlamına gelmez. Modulo hesaplaması için yapılmış bir JavaScript seçimidir. Çünkü, tanım gereği her iki cevap da mantıklıdır.
Bunu Wikipedia'dan görün . Sağda, farklı dillerin sonucun işaretini nasıl seçtiğini görebilirsiniz.
Görünüşe göre dereceler etrafında mod değiştirmeye çalışıyorsanız (-50 dereceniz - 200 dereceniz varsa) gibi bir şey kullanmak istersiniz:
function modrad(m) {
return ((((180+m) % 360) + 360) % 360)-180;
}
Negatif a ve negatif n ile de ilgileniyorum
//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);
}
Bu bir hata değil, modulo hesaplamak için 3 fonksiyon var, ihtiyaçlarınıza uyan olanı kullanabilirsiniz (Öklid fonksiyonunu kullanmanızı tavsiye ederim)
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
%
negatif sonuçlar döndürebilir (bu bu fonksiyonların amacı, düzeltmek için)
parseInt(-41).mod(-7)
dönecekti (ve bu tam olarak yazdığım Tamsayı parçası işlevinin -6
1
İşi sizin için yapacak bir NPM paketi var. Aşağıdaki komutla kurabilirsiniz.
npm install just-modulo --save
Kullanım README'den kopyalandı
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 deposunu aşağıdaki bağlantıdan bulabilirsiniz:
https://github.com/angus-c/just/tree/master/packages/number-modulo
(-13) % 64
yoksa-(13 % 64)
? Şahsen, ben sadece ekstra netlik için, her iki şekilde de parens koymak istiyorum.