মতে Google ক্যালকুলেটর (-13) % 64
হয় 51
।
জাভাস্ক্রিপ্ট অনুসারে (এই জেএসবিনটি দেখুন ) এটি -13
।
আমি কিভাবে এটা ঠিক করব?
%
জেএসের মধ্যে মডুলো অপারেটর নয়। এটা বাকি অপারেটর। জাভাস্ক্রিপ্টে কোনও মডুলো অপারেটর নেই। সুতরাং গৃহীত উত্তর হ'ল উপায়।
মতে Google ক্যালকুলেটর (-13) % 64
হয় 51
।
জাভাস্ক্রিপ্ট অনুসারে (এই জেএসবিনটি দেখুন ) এটি -13
।
আমি কিভাবে এটা ঠিক করব?
%
জেএসের মধ্যে মডুলো অপারেটর নয়। এটা বাকি অপারেটর। জাভাস্ক্রিপ্টে কোনও মডুলো অপারেটর নেই। সুতরাং গৃহীত উত্তর হ'ল উপায়।
উত্তর:
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
এই নিবন্ধ থেকে নেওয়া: জাভাস্ক্রিপ্ট মডুলো বাগ
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
s m
এটা হওয়া উচিত return ((n % m) + m) % m;
।
%
জাভাস্ক্রিপ্টে অপারেটর বাকি অপারেটর, না মডিউল অপারেটর (মূল পার্থক্য কিভাবে ঋণাত্মক সংখ্যা চিকিত্সা করা হয় হচ্ছে) হল:
-1 % 8 // -1, not 7
remainder
, এটি সংজ্ঞা অনুসারে 0 এর চেয়ে বড় হতে হবে। আপনি কি হাই স্কুল থেকে বিভাগের উপপাদ্যটি মনে করতে পারেন না ?! সুতরাং আপনি এখানে একবার নজর রাখতে পারেন: en.wikedia.org/wiki/Euclidean_division
একটি "মোড" ফাংশন একটি ইতিবাচক ফলাফল ফেরত দেওয়ার জন্য।
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
ঠিক সেখানে ইউআরএলটিতে উল্লেখ রয়েছে :) যাইহোক, নোটটির জন্য ধন্যবাদ, আমি আমার উত্তরটি থেকে ফ্লাফটি নিয়েছি, যাইহোক এটি সত্যিই গুরুত্বপূর্ণ নয়।
গৃহীত উত্তরটি আমাকে কিছুটা ঘাবড়েছে কারণ এটি% অপারেটরটিকে পুনরায় ব্যবহার করে। ভবিষ্যতে যদি জাভাস্ক্রিপ্ট আচরণ পরিবর্তন করে?
এখানে এমন একটি কর্মক্ষেত্র যা পুনরায়%% ব্যবহার করে না:
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;
}
আমি নেগেটিভ এ এবং নেগেটিভ এন এর সাথেও ডিল করি
//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
একটি এনপিএম প্যাকেজ রয়েছে যা আপনার পক্ষে কাজ করবে। আপনি নিম্নলিখিত কমান্ড দিয়ে এটি ইনস্টল করতে পারেন।
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
(-13) % 64
নাকি-(13 % 64)
? ব্যক্তিগতভাবে, আমি কেবল অতিরিক্ত স্পষ্টতার জন্য প্যারেন্সগুলিকে কোনওভাবেই রাখি।