JavaScript% (модуль) теріс сандар үшін теріс нәтиже береді

Google Калькуляторы бойынша (-13) % 64 бар.

Javascript-ге сәйкес ( JSBin-ті қараңыз) -13 .

Оны қалай түзетуге болады?

175
17 дек. Alec шатқалы 17 желтоқсанға белгіленген. 2010-12-17 06:55 '10 at 6:55 2010-12-17 06:55
@ 11 жауап
 Number.prototype.mod = function(n) { return ((this%n)+n)%n; }; 

Осы мақаладан алынған: JavaScript модулінің қатесі

196
17 дек. Жауап 17-желтоқсан. 2010-12-17 06:59 '10 сағат 6:59 дейін 2010-12-17 06:59

Number.prototype пайдалану SLOW болып табылады, себебі прототип әдісін қолданған сайын, сіздің нөміріңіз Object оралады. Бұның орнына:

 Number.prototype.mod = function(n) { return ((this % n) + n) % n; } 

Пайдаланыңыз:

border=0
 function mod(n, m) { return ((n % m) + m) % m; } 

Қараңыз: http://jsperf.com/negative-modulo/2

~ 97% прототипін пайдаланудан жылдамырақ. Егер сіз үшін өнімділік маңызды болса, әрине.

92
26 июня '13 в 17:57 2013-06-26 17:57 жауапты StuR 26 маусымда сағат 17 : 57-де жазады 2013-06-26 17:57

JavaScript-дегі % оператор - модуль операторы емес, тоқтау операторы (негізгі айырмашылық теріс сандар қалай өңделетінін білдіреді):

-1 % 8 // -1, not 7

20
17 дек. Жауап Роб Соберс дек 17 2010-12-17 07:11 '10 at 7:11 2010-12-17 07:11

Қалай болғанда да, оң нәтижені қайтару үшін «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 
13
31 окт. 31 жастағы Шанималға жауап берілді . 2012-10-31 20:22 '12 сағат 20 : 22-де 2012-10-31 20:22

Қабылданған жауап маған біраз нервтенеді, себебі ол% операторын қайта пайдаланады. Егер болашақта 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 
9
10 апр. Жауап 10- мамырда айтылды 2013-04-10 01:38 '13 at 1:38 2013-04-10 01:38

Егер x бүтін сан болса және n - 2 күші болса, сіз x % n орнына x (n - 1) пайдалана аласыз.

 > -13  (64 - 1) 51 
3
11 мая '14 в 23:39 2014-05-11 23:39 Сұраққа жауап quasimodo 11 мамыр '14 at 11:39 2014-05-11 23:39

Ол сіз күткендей әрекет етпесе де, бұл JavaScript «өзін ұстамайды» дегенді білдірмейді. Бұл модульдік есептеу үшін жасалған JavaScript нұсқасы. Өйткені, анықтамаға сай, кез-келген жауап мағыналы болады.

Википедиядан қараңыз. Оң жақта түрлі тілдерде нәтиже белгісін қалай таңдағанын көруге болады.

3
17 дек. жауап диросор 17 желтоқсанға беріледі. 2010-12-17 07:07 '10 at 7:07 2010-12-17 07:07

Мәселен, егер сіз дәрежелерді өзгертуге тырыссаңыз (егер сізде -50 градус - 200 градус болса), сіз төмендегідей нәрселерді пайдаланғыңыз келеді:

 function modrad(m) { return ((((180+m) % 360) + 360) % 360)-180; } 
2
03 апр. Жауап JayCrossler 03 сәу 2014-04-03 23:12 '14 at 23:12 2014-04-03 23:12

Мен сауатсыз және жағымсыз нәрселермен айналысамын

  //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); } 
1
13 мая '15 в 20:55 2015-05-13 20:55 жауап 13 мамырда 13.00-да 20.00-да болады

Бұл қате емес, модуль бойынша есептеуге арналған 3 функция бар, сіз өзіңіздің қажеттіліктеріңізге сәйкес келетінін пайдалана аласыз (Euclidean функциясын қолдану ұсынылады)

Ондық бөлікті қиып алу функциясы

 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 
1
04 янв. жауап zessx 04 jan беріледі. 2014-01-04 21:29 '14 at 21:29 2014-01-04 21:29

Сізге жұмыс істейтін 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

0
21 июля '17 в 21:13 2017-07-21 21:13 жауап 21-шілдеде сағат 21: 13-де 2017-07-21 21:13 аралығында өтеді

тегтеріне қатысты басқа сұрақтар немесе Сұрақ қойыңыз