За даними Google Calculator (-13) % 64
є 51
.
Згідно з Javascript (див. Цей JSBin ), це так -13
.
Як це виправити?
%
є не оператор модуля. Це решта оператора. У JavaScript немає жодного модульного оператора. Тож прийнята відповідь - це шлях.
За даними Google Calculator (-13) % 64
є 51
.
Згідно з Javascript (див. Цей JSBin ), це так -13
.
Як це виправити?
%
є не оператор модуля. Це решта оператора. У JavaScript немає жодного модульного оператора. Тож прийнята відповідь - це шлях.
Відповіді:
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
Взято з цієї статті: Помилка модуля JavaScript
x < -n
- наприклад, (-7 + 5) % 5 === -2
але ((-7 % 5) + 5) % 5 == 3
.
Використання Number.prototype
- НИЗЬКО, тому що кожного разу, коли ви використовуєте метод прототипу, ваш номер загортається у 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
S навколо неправильно у вашому другому прикладі @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
зміни? Тоді ваш код жахливо порушений.
Тож здається, що якщо ви намагаєтеся змінити градуси (так що якщо у вас -50 градусів - 200 градусів), ви хочете використовувати щось на зразок:
function modrad(m) {
return ((((180+m) % 360) + 360) % 360)-180;
}
Я маю справу і з негативним 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, яку я написав)
Є пакет 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)
? Особисто я поставив би парень будь-яким способом, просто для додаткової ясності.