জাভাস্ক্রিপ্ট% (মডুলো) নেতিবাচক সংখ্যার জন্য নেতিবাচক ফলাফল দেয়


252

মতে Google ক্যালকুলেটর (-13) % 64 হয় 51

জাভাস্ক্রিপ্ট অনুসারে (এই জেএসবিনটি দেখুন ) এটি -13

আমি কিভাবে এটা ঠিক করব?


এটি কেবল একটি অগ্রাধিকারের সমস্যা হতে পারে। মানে (-13) % 64নাকি -(13 % 64)? ব্যক্তিগতভাবে, আমি কেবল অতিরিক্ত স্পষ্টতার জন্য প্যারেন্সগুলিকে কোনওভাবেই রাখি।
ম্যাট্রিক্সফ্রোগ


85
জাভাস্ক্রিপ্ট কখনও কখনও খুব নিষ্ঠুর রসিকতার মতো মনে হয়
ডিউকুফগেমিং

6
গুগল ভুল হতে পারে না
সাবধান

10
মৌলিক সমস্যা %জেএসের মধ্যে মডুলো অপারেটর নয়। এটা বাকি অপারেটর। জাভাস্ক্রিপ্টে কোনও মডুলো অপারেটর নেই। সুতরাং গৃহীত উত্তর হ'ল উপায়।
রেডু

উত্তর:


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

এই নিবন্ধ থেকে নেওয়া: জাভাস্ক্রিপ্ট মডুলো বাগ


23
আমি জানি না যে আমি এটিকে "বাগ" বলব। মডুলো অপারেশনটি নেতিবাচক সংখ্যার তুলনায় খুব ভালভাবে সংজ্ঞায়িত হয় না এবং বিভিন্ন কম্পিউটিং পরিবেশগুলি এটিকে অন্যভাবে পরিচালনা করে। মডুলো অপারেশন সম্পর্কিত উইকিপিডিয়ায় নিবন্ধ এটি বেশ ভালভাবে কভার করে।
ড্যানিয়েল প্রাইডেন

22
এটি মূক বলে মনে হতে পারে কারণ এটি প্রায়শই 'মডুলো' বলে অভিহিত করা হয়, এটি তার গণিত সংজ্ঞা (দেখুন ℤ / nℤ বীজগণিত) এর মতো আচরণ করবে বলে মনে করে যা এটি দেয় না।
এটিয়েন

7
এন যুক্ত করার আগে মডুলো নেবেন কেন? কেন শুধু এন যুক্ত না করে মডুলো নেবেন?
দেখানো হয়েছে

12
@starwed যদি এই% ব্যবহার করেননি এন এটির জন্য ব্যর্থ হবে x < -n- যেমন (-7 + 5) % 5 === -2কিন্তু ((-7 % 5) + 5) % 5 == 3
fadebee

7
আমি উত্তরে যুক্ত করার পরামর্শ দিচ্ছি যে এই ফাংশনটি অ্যাক্সেস করতে গেলে -13% 10 এর পরিবর্তে ফর্ম্যাটটি (-13) .mod (10) ব্যবহার করা উচিত এটি আরও স্পষ্ট হবে।
Jp_

161

ব্যবহার করা 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% দ্রুত। পারফরম্যান্স অবশ্যই আপনার জন্য যদি গুরুত্ব হয় ..


1
দুর্দান্ত টিপ। আমি তোমার jsperf নেন এবং এই প্রশ্নে সমাধান বাকি সঙ্গে তুলনা (কিন্তু মনে হচ্ছে এই শ্রেষ্ঠ আসলে): jsperf.com/negative-modulo/3
মারিয়ানো Desanze

11
মাইক্রো-অপ্টিমাইজেশান। আপনি একটি কাজ করা আছে চাই বৃহদায়তন কোনো পার্থক্য সবটা করতে এই জন্য গেলিক ভাষার গণনার পরিমাণ। কী পরিষ্কার এবং সবচেয়ে রক্ষণাবেক্ষণযোগ্য তা কোড করুন, তারপরে নিম্নলিখিত কার্য সম্পাদন বিশ্লেষণটি অনুকূলিত করুন।
ChrisV

আমি মনে করি আপনার দ্বিতীয় উদাহরণ @ এসটিআর-তে আপনি ভুল উপায় পেয়েছেন ns mএটা হওয়া উচিত return ((n % m) + m) % m;
ভিমিস্ট

এটি নিজের জন্য একটি উত্তর নয়, স্বীকৃত উত্তরের একটি মন্তব্য হওয়া উচিত।
xehpuk

5
এই উত্তরে বর্ণিত অনুপ্রেরণা একটি মাইক্রো-অপ্টিমাইজেশন, হ্যাঁ, তবে প্রোটোটাইপটি পরিবর্তন করা সমস্যাযুক্ত। সবচেয়ে কম পার্শ্ব প্রতিক্রিয়াগুলির সাথে পদ্ধতির পছন্দ করুন, এটি হ'ল এটি।
আগ্রহী

30

%জাভাস্ক্রিপ্টে অপারেটর বাকি অপারেটর, না মডিউল অপারেটর (মূল পার্থক্য কিভাবে ঋণাত্মক সংখ্যা চিকিত্সা করা হয় হচ্ছে) হল:

-1 % 8 // -1, not 7


8
এটা তোলে উচিত বাকি অপারেটর বলা যেতে কিন্তু এটি করা হয় : মডুলাস অপারেটর নামক developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
বিগ McLargeHuge

15
@ ডেভ কেনেডি: এমডিএন কোনও অফিসিয়াল ভাষা উল্লেখ নয়, এটি একটি সম্প্রদায়-সম্পাদিত সাইট যা কখনও কখনও এটি ভুল হয়ে যায়। বৈশিষ্ট এটি একটি ফরম অপারেটরের কল দেয় না, আর যতদূর আমি বলতে পারি এটা আছে (আমি ES3 ফিরে গেলেন)। এটি স্পষ্টতই বলেছে যে অপারেটর একটি বিভক্ত বিভাগের বাকী অংশ দেয় এবং কেবল এটি "% অপারেটর" বলে।
টিজে ক্রাউডার

2
যদি এটি বলা হয় remainder, এটি সংজ্ঞা অনুসারে 0 এর চেয়ে বড় হতে হবে। আপনি কি হাই স্কুল থেকে বিভাগের উপপাদ্যটি মনে করতে পারেন না ?! সুতরাং আপনি এখানে একবার নজর রাখতে পারেন: en.wikedia.org/wiki/Euclidean_division
আহমেদ

19

একটি "মোড" ফাংশন একটি ইতিবাচক ফলাফল ফেরত দেওয়ার জন্য।

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

1
এমডিএন কোনও অফিসিয়াল ভাষার উল্লেখ নয়, এটি একটি সম্প্রদায়-সম্পাদিত সাইট যা কখনও কখনও এটি ভুল হয়ে যায়। বৈশিষ্ট এটি একটি ফরম অপারেটরের কল দেয় না, আর যতদূর আমি বলতে পারি এটা আছে (আমি ES3 ফিরে গেলেন)। এটি স্পষ্টতই বলেছে যে অপারেটর একটি বিভক্ত বিভাগের বাকী অংশ দেয় এবং কেবল এটি "% অপারেটর" বলে।
টিজে ক্রাউডার

1
ওফস, আপনি যে লিঙ্কটি নির্দিষ্ট করেছেন তা #sec-applying-the-mod-operatorঠিক সেখানে ইউআরএলটিতে উল্লেখ রয়েছে :) যাইহোক, নোটটির জন্য ধন্যবাদ, আমি আমার উত্তরটি থেকে ফ্লাফটি নিয়েছি, যাইহোক এটি সত্যিই গুরুত্বপূর্ণ নয়।
শানিমাল

3
@ শানিমাল: এলএল! এটা করে. এইচটিএমএল সম্পাদক দ্বারা একটি ত্রুটি। অনুমান পাঠ্য না।
টিজে ক্রাউডার

10

গৃহীত উত্তরটি আমাকে কিছুটা ঘাবড়েছে কারণ এটি% অপারেটরটিকে পুনরায় ব্যবহার করে। ভবিষ্যতে যদি জাভাস্ক্রিপ্ট আচরণ পরিবর্তন করে?

এখানে এমন একটি কর্মক্ষেত্র যা পুনরায়%% ব্যবহার করে না:

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

8
যদি জাভাস্ক্রিপ্ট গাণিতিক সংজ্ঞাটির সাথে মিলে মডুলো অপারেটর পরিবর্তন করে তবে স্বীকৃত উত্তরটি এখনও কাজ করবে।
স্টার করা হয়েছে

20
"জাভাস্ক্রিপ্ট যদি ভবিষ্যতে আচরণ পরিবর্তন করে?" - কেন হবে? এই জাতীয় মৌলিক অপারেটরের আচরণ পরিবর্তন করা সম্ভবত না।
nnnnnn

1
এই উদ্বেগটি ভাগ করে নেওয়ার জন্য +1 এবং বিকল্পযুক্ত বৈশিষ্ট্যযুক্ত উত্তরটির উত্তর # উত্তর -৪7567559৫৫ এবং ৪ টি কারণে: (১) কেন এটি বর্ণনা করা হয়েছে, এবং হ্যাঁ "এই জাতীয় মৌলিক বিকল্পের আচরণ পরিবর্তন করা সম্ভবত নয়" তবে তবুও বিবেচনা করা বুদ্ধিমানের এমনকি এটির প্রয়োজন নেই তা সন্ধান করতে। (২) একটি ভাঙ্গা শর্ত হিসাবে একটি কাজের বিকল্প সংজ্ঞায়িত করা, যদিও চিত্তাকর্ষক, কমপক্ষে 1 ম দৃষ্টিভঙ্গিতে উদ্বেগজনক, তিলে দেখানো উচিত নয় (3) এই বিকল্পটি ভালভাবে যাচাই করা উচিত নয়, আমি অনুসরণ করতে সহজতর পাই দ্রুত দেখা. (4) ক্ষুদ্র: এটি 2 (মোড) ডিভের পরিবর্তে 1 ডিভ + 1 মুল ব্যবহার করে এবং আমি এর আগে হার্ডওয়ার ডাব্লু / ওএ ভাল এফপিইউতে শুনেছি, গুণটি আরও দ্রুত ছিল।
ডেসটিনি আর্কিটেক্ট

2
@ ডিস্টিনিআর্কিটেক্ট এটি বিচক্ষণ নয়, এটি অর্থহীন। যদি তারা বাকী অপারেটরটির আচরণ পরিবর্তন করে, এটি এটি ব্যবহার করে প্রোগ্রামের একটি ভাল পরিসর ভেঙে দেয়। এটি কখনই ঘটবে না।
এজিস

9
কি আচরণ যদি -, *, /, ;, ., (, ), ,, Math.floor, functionবা returnপরিবর্তন? তারপরে আপনার কোডটি ভয়াবহভাবে ভেঙে গেছে।
xehpuk

5

যদিও এটি আপনি প্রত্যাশা মতো আচরণ করছেন না, এর অর্থ এই নয় যে জাভাস্ক্রিপ্টটি 'আচরণ করছে না'। এটি এর মডুলোর গণনার জন্য তৈরি একটি পছন্দ জাভাস্ক্রিপ্ট। কারণ, সংজ্ঞা দ্বারা উত্তরটি বোধগম্য হয়।

দেখুন এই উইকিপিডিয়া থেকে। আপনি ডানদিকে দেখতে পাচ্ছেন যে বিভিন্ন ভাষা কীভাবে ফলাফলের চিহ্নটি বেছে নিয়েছিল।


3

যদি xএকটি পূর্ণসংখ্যা হয় এবং n2 এর শক্তি হয় তবে আপনি এর x & (n - 1)পরিবর্তে ব্যবহার করতে পারেন x % n

> -13 & (64 - 1)
51 

2

সুতরাং মনে হচ্ছে আপনি যদি প্রায় ডিগ্রি পরিবর্তনের চেষ্টা করছেন (যাতে আপনার যদি -50 ডিগ্রি - 200 ডিগ্রি থাকে) তবে আপনি এর মতো কিছু ব্যবহার করতে চান:

function modrad(m) {
    return ((((180+m) % 360) + 360) % 360)-180;
}

1

আমি নেগেটিভ এ এবং নেগেটিভ এন এর সাথেও ডিল করি

 //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

এটি কোনও বাগ নয়, মডুলো গণনা করার জন্য 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

1
ইউক্যালিডিয়ান ফাংশনটিতে এম <0 টি পরীক্ষা করা নিষ্ক্রিয় কারণ ((এটি% এন) + এন)% এন সর্বদা ইতিবাচক থাকে
বোর্ম্যাট

@ বর্ম্যাট হ্যাঁ এটি তবে জাভাস্ক্রিপ্টে %নেতিবাচক ফলাফলগুলি ফিরে আসতে পারে (এটি ঠিক করার পক্ষে এটি এই ফাংশনগুলির উদ্দেশ্য)
জেসেক্স

আপনি এই [কোড] নাম্বার.প্রোটোটাইপ.মোড = ফাংশন (এন) m ভার এম = ((এই% এন) + এন)% এন লিখেছেন; ফিরবেন এম <0? মি + ম্যাথ.এবস (এন): এম; }; [/ কোড] আমাকে এন এর একটি মান দিন যেখানে মি éণাত্মক। এগুলি n এর কোনও মূল্য নয় যেখানে মি éণাত্মক কারণ আপনি প্রথম% এর পরে n যুক্ত করেন।
বোর্মেট

এই চেকটি না করে, পরিবর্তে parseInt(-41).mod(-7)ফিরে আসবে (এবং ঠিক এটিই আমি লিখেছিলাম পূর্ণসংখ্যা অংশ ফাংশনের উদ্দেশ্য)-61
জেসেক্স x

হা ঠিক আছে, আপনি ঠিক বলেছেন, আমার সব ক্ষমা, আমি নেতিবাচক মডুলো ভুলে গেছি, আমি কেবল "এই" নেতিবাচক সম্পর্কে ভাবছিলাম। আমি কি ম্যাথ.এবস সংখ্যা.প্রোটোটাইপ.মোড = ফাংশন (এন) {রিটার্ন ((এই% এন) + ম্যাথ.এবস (এন))% এন স্থানান্তরিত করার পরামর্শ দিতে পারি; }; (-41)। আধুনিক (-7) == 1 // কোন প্রয়োজন নেই
পার্সেন্ট

0

একটি এনপিএম প্যাকেজ রয়েছে যা আপনার পক্ষে কাজ করবে। আপনি নিম্নলিখিত কমান্ড দিয়ে এটি ইনস্টল করতে পারেন।

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

গিটহাবের সংগ্রহস্থলটি নিম্নলিখিত লিঙ্কের মাধ্যমে পাওয়া যাবে:

https://github.com/angus-c/just/tree/master/packages/number-modulo

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.