উত্তর:
কিছু সংখ্যক yএবং কিছু বিভাজকের xজন্য ভাগফল ( quotient) এবং বাকী ( remainder) কে গণনা করুন :
var quotient = Math.floor(y/x);
var remainder = y % x;
floorএবং %একসাথে এইভাবে সামঞ্জস্যপূর্ণ নয়। হয় (এর ফলে নেতিবাচক অবশিষ্টদের অনুমতি দেওয়া) truncএর পরিবর্তে ব্যবহার করুন floorবা বাকীটি পেতে ( rem = y - div * x) বিয়োগফল ব্যবহার করুন ।
remযাই হোক, আপনি ভাগফল পেতে পারেন divদ্রুত মেঝে ছাড়া: (y - rem) / x। 2. পথ ডোনাল্ড Knuth এর প্রস্তাবিত সংজ্ঞা দ্বারা মডিউল অপারেশন (সাইন-ম্যাচ-ভাজক, না বাকি অর্থাত ইউক্লিডিয় মডুলাস, কিংবা জাভাস্ক্রিপ্ট সাইন-ম্যাচ-লভ্যাংশ) কীসের আমরা যত জাভাস্ক্রিপ্ট কোড করতে পারেন হয় function mod (a, n) { return a % n + (Math.sign(a) !== Math.sign(n) ? n : 0); }।
আমি বিটওয়াইজ অপারেটরগুলির বিশেষজ্ঞ নই, তবে পুরো নম্বরটি পাওয়ার আরও একটি উপায় এখানে রয়েছে:
var num = ~~(a / b);
এটি negativeণাত্মক সংখ্যার জন্যও সঠিকভাবে কাজ করবে, অন্যদিকে Math.floor()ভুল দিক দিয়ে চলেছে।
এটিও সঠিক বলে মনে হচ্ছে:
var num = (a / b) >> 0;
a/b | 0
~~int, int | 0এবং int >> 0প্রাথমিক যুক্তি সংশোধন করে না, তবে দোভাষীকে অপারেটরের কাছে অবিচ্ছেদ্য অংশ করুন।
floorখুব সহজেই ভুল দিকে গোল করে, এর নাম দেওয়া হয়েছে - মানুষ সাধারণত যে দিকটি চায় তা কেবল নয়!
a = 12447132275286670000; b = 128 Math.floor(a/b)-> 97243220900677100এবং ~~(a/b)-> -1231452688।
~~(5/2) --> 2যেমন করে (5/2)>>0 --> 2, কিন্তু ~~(5/2) + 1 --> 3, যখন ~~(5/2)>>0 + 1 --> 1। ~~অগ্রাধিকার আরও উপযুক্ত কারণ একটি ভাল পছন্দ।
আমি ফায়ারফক্সে কিছু গতি পরীক্ষা করেছি।
-100/3 // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34, 0.5016 millisec
~~(-100/3) // -33, 0.3619 millisec
(-100/3>>0) // -33, 0.3632 millisec
(-100/3|0) // -33, 0.3856 millisec
(-100-(-100%3))/3 // -33, 0.3591 millisec
/* a=-100, b=3 */
a/b // -33.33..., 0.4863 millisec
Math.floor(a/b) // -34, 0.6019 millisec
~~(a/b) // -33, 0.5148 millisec
(a/b>>0) // -33, 0.5048 millisec
(a/b|0) // -33, 0.5078 millisec
(a-(a%b))/b // -33, 0.6649 millisec
উপরোক্ত প্রতিটি জন্য 10 মিলিয়ন ট্রায়াল উপর ভিত্তি করে।
উপসংহার: ব্যবহার করুন (a/b>>0)(অথবা (~~(a/b))বা (a/b|0)) দক্ষতা% লাভ 20 সম্পর্কে অর্জন করা। এগুলিও মনে রাখবেন যে তারা Math.floorকখন, কখনই অসম্পূর্ণ a/b<0 && a%b!=0।
Math.floorকতগুলি এপিআই ফাংশন সম্পর্কে শিখতে এবং ~(বিটওয়াইস-নট) অপারেটর সম্পর্কে শিখতে এবং কীভাবে বিএসওয়াইস অপারেশন জেএসে কাজ করে এবং তারপরে ডাবল টিলডের প্রভাব বোঝে ?
Math.floorআরও ভাল বুঝতে পারবেন । এবং না হলেও, এটি গুগল able
ES6 নতুন Math.truncপদ্ধতিটি প্রবর্তন করে । এটি @ মার্কএলিয়ট এর উত্তর ঠিক করার অনুমতি দেয় যাতে এটি নেতিবাচক সংখ্যার জন্যও কার্যকর হয়:
var div = Math.trunc(y/x);
var rem = y % x;
নোট করুন যে Mathপদ্ধতিগুলি বিটওয়াইজ অপারেটরগুলির চেয়ে সুবিধা অর্জন করে যে তারা 2 31 এর উপরে সংখ্যা নিয়ে কাজ করে ।
18014398509481984 == 18014398509481985,।
~~(x/y)। স্বাক্ষরিত 54 বিট পর্যন্ত বড় সংখ্যা সমর্থন করা দরকার? আপনার কাছে Math.truncথাকলে বা Math.floorঅন্যথায় (নেতিবাচক সংখ্যার জন্য সঠিক) ব্যবহার করুন। আরও বড় সংখ্যা সমর্থন করা প্রয়োজন? কিছু বড় সংখ্যক গ্রন্থাগার ব্যবহার করুন।
divmodএটি প্রয়োগ করতে পারেন:function divmod(x, y) { var div = Math.trunc(x/y); var rem = x % y; return [div, rem]; }
var remainder = x % y;
return (x - remainder) / y;
Math.trunc:) হিসাবে একই মানগুলি প্রদান করে । আমি 100,3 দিয়ে পরীক্ষা করেছি; -100,3; 100, -3 এবং -100, -3। অবশ্যই, আপনার মন্তব্য এবং জিনিসগুলি পরিবর্তনের পরে অনেক সময় কেটে গেছে।
আমি সাধারণত:
const quotient = (a - a % b) / b;
const remainder = a % b;
এটি সম্ভবত সবচেয়ে মার্জিত নয়, তবে এটি কার্যকর।
আপনি parseIntএকটি কাটা ফলাফল পেতে ফাংশনটি ব্যবহার করতে পারেন ।
parseInt(a/b)
বাকিগুলি পেতে, মোড অপারেটরটি ব্যবহার করুন:
a%b
বেস 10 এর সাথে র্যাডিক্স প্যারামিটার ব্যবহার এড়াতে স্ট্রিংগুলির সাথে পার্সেন্টের কিছু সমস্যা রয়েছে
parseInt("09", 10)
কিছু ক্ষেত্রে সংখ্যার স্ট্রিং প্রতিনিধিত্ব একটি বৈজ্ঞানিক স্বরলিপি হতে পারে, এই ক্ষেত্রে, পার্সিয়ান্ট একটি ভুল ফলাফল আনবে।
parseInt(100000000000000000000000000000000, 10) // 1e+32
এই কল ফলাফল হিসাবে 1 উত্পাদন করবে।
parseIntসম্ভব হলে এড়ানো উচিত। এখানে ডগলাস ক্রকফোর্ডের সতর্কতা হ'ল: "যদি স্ট্রিংটির প্রথম অক্ষর 0 হয় তবে স্ট্রিংটি বেস 10 এর পরিবর্তে বেস 8 এ মূল্যায়ন করা হয়। বেস 8 তে, 8 এবং 9 সংখ্যা নয়, সুতরাং পার্সেন্ট (" 08 ") এবং পার্সেন্ট ("09") তাদের ফলাফল হিসাবে 0 উত্পাদন করে। এই ত্রুটিটি প্রোগ্রামগুলিতে সমস্যা সৃষ্টি করে যা তারিখ এবং সময়গুলি পার্স করে। ভাগ্যক্রমে, পার্সইন্ট একটি র্যাডিক্স প্যারামিটার নিতে পারে, যাতে পার্সেন্ট ("08", 10) 8 উত্পন্ন হয় I আমি আপনাকে সুপারিশ করি সর্বদা রেডিক্স প্যারামিটার সরবরাহ করুন। " আর্কাইভ.ওরিলি.com
parseIntএড়ানো উচিত; ঠিক তেমন কিছু সচেতন থাকতে হবে। আপনাকে অবশ্যই এই বিষয়গুলি সম্পর্কে সচেতন হতে হবে এবং মোকাবেলা করার জন্য প্রস্তুত থাকতে হবে।
parseIntকোনও সংখ্যার যুক্তি দিয়ে কল করবেন না । parseIntআংশিক-সংখ্যাগত স্ট্রিং পার্স করার কথা, সংখ্যাগুলি কেটে দেওয়া হবে না।
জাভাস্ক্রিপ্ট তাদের গাণিতিক সংজ্ঞা অনুসরণ করে negativeণাত্মক সংখ্যার তল এবং অ-পূর্ণসংখ্যার অবশিষ্টগুলির গণনা করে।
ফ্লোরটিকে "প্যারামিটারের চেয়ে ছোট বৃহত্তম পূর্ণসংখ্যার সংখ্যা" হিসাবে সংজ্ঞায়িত করা হয়:
স্মারককে বিভাগের "বাম ওভার" হিসাবে চিহ্নিত করা হয় (ইউক্লিডিয়ান পাটিগণিত)। যখন লভ্যাংশটি কোনও পূর্ণসংখ্যার হয় না, তখন ভাগফলটি সাধারণত কোনও পূর্ণসংখ্যারও হয় না, অর্থাত্ কোনও অবশিষ্ট নেই but ভাসমান-পয়েন্ট নম্বর), অবশ্যই একটি অ-পূর্ণসংখ্যার "বাম উপরে" থাকবে, স্পষ্টতই।
জাভাস্ক্রিপ্ট প্রত্যাশিত হিসাবে সবকিছু গণনা করে, সুতরাং প্রোগ্রামারকে অবশ্যই সঠিক প্রশ্ন জিজ্ঞাসা করতে সতর্ক থাকতে হবে (এবং লোকেরা যা জিজ্ঞাসা করা হয়েছে তার উত্তর দিতে সতর্ক হওয়া উচিত!) ইয়ারিনের প্রথম প্রশ্নটি "ওয়াই দ্বারা এক্স এর পূর্ণসংখ্যা বিভাগ কী" নয়, তবে, পরিবর্তে, "প্রদত্ত পূর্ণসংখ্যার পুরো সংখ্যাটি অন্যটিতে যায়"। ধনাত্মক সংখ্যার জন্য, উত্তর উভয়ের জন্য একই, তবে negativeণাত্মক সংখ্যার জন্য নয়, কারণ সংখ্যার (বিভাজক) "" অন্য "(ডিভিডেন্ড) -এ যাওয়ার সময়ের চেয়ে পূর্ণসংখ্যা বিভাগ (ডিভাইডারের দ্বারা লভ্যাংশ) -1 ছোট হবে। অন্য কথায়, ফ্লোর একটি নেতিবাচক সংখ্যার পূর্ণসংখ্যা বিভাগের জন্য সঠিক উত্তরটি ফিরিয়ে দেবে, তবে ইয়্যারিন তা জিজ্ঞাসা করলেন না!
গ্যাম্যাক্স সঠিকভাবে উত্তর দিয়েছে, এই কোডটি ইয়ারিনের অনুরোধ অনুসারে কাজ করে। অন্যদিকে, স্যামুয়েল ভুল, তিনি গণিত করেননি, আমার ধারণা, বা তিনি দেখতে পেয়েছেন যে এটি কাজ করে (এছাড়াও, তিনি তার উদাহরণের বিভাজক কী তা বলেন নি, তবে আমি আশা করি এটি ছিল 3):
অবশিষ্টাংশ = এক্স% ওয়াই = -100% 3 = -1
গোয়েসন্টো = (এক্স - রিমাইন্ডার) / ওয়াই = (-100 - -1) / 3 = -99 / 3 = -33
যাইহোক, আমি ফায়ারফক্স ২.0.০.১-তে কোডটি পরীক্ষা করেছি, এটি প্রত্যাশা অনুযায়ী কাজ করেছে, ইতিবাচক এবং নেতিবাচক সংখ্যার সাথে এবং লভ্যাংশ এবং বিভাজক উভয়ের জন্য অ-পূর্ণসংখ্যার মানগুলির সাথেও। উদাহরণ:
-100.34 / 3.57: গোয়েসন্টো = -28, অবশিষ্টাংশ = -0.3800000000000079
হ্যাঁ, আমি লক্ষ করেছি, সেখানে একটি যথার্থ সমস্যা আছে, তবে এটি পরীক্ষা করার আমার কাছে সময় ছিল না (এটি ফায়ারফক্স, উইন্ডোজ 7 বা আমার সিপিইউয়ের এফপিইউতে সমস্যা কিনা তা আমি জানি না)। ইয়ারিনের প্রশ্নের জন্য, যদিও এটিতে কেবল পূর্ণসংখ্যা জড়িত, গ্যামাক্সের কোডটি পুরোপুরি কার্যকরভাবে কাজ করে।
পৃষ্ঠাগুলির সংখ্যা গণনা এক ধাপে করা যেতে পারে: ম্যাথ.সিল (x / y)
উত্তর হিসাবে অ্যালেক্স মুর-নীমির মন্তব্য:
গুগল থেকে এখানে রুবিস্টদের সন্ধানে divmod, আপনি এটি প্রয়োগ করতে পারেন:
function divmod(x, y) {
var div = Math.trunc(x/y);
var rem = x % y;
return [div, rem];
}
ফলাফল:
// [2, 33]
divmodমেঝেযুক্ত বিভাগ ( Math.floor) ব্যবহার করে , যা Math.truncনেতিবাচক সংখ্যার সাথে জড়িত থাকার সময় কাটা বিভাগ ( ) থেকে পৃথক হয়। এটি এনপিএম divmodপ্যাকেজ , রুবিdivmod , এসডাব্লুআই-প্রোলোগdivmod এবং সম্ভবত অন্যান্য অনেকগুলি বাস্তবায়নের ক্ষেত্রেও এটি।
divmodউপস্থিত থাকে কারণ এটি দুটি অপারেশন পৃথকভাবে কম্পিউটিংয়ের চেয়ে দ্বিগুণ দ্রুত সম্পাদন করে। এই কর্মক্ষমতা সুবিধা ছাড়াই এই জাতীয় কোনও ক্রিয়াকলাপ প্রদান বিভ্রান্তিকর হতে পারে।
আপনি যদি কেবল দুটিটির সাথে ভাগ করে চলেছেন তবে আপনি বিটওয়াইড অপারেটরগুলি ব্যবহার করতে পারেন:
export function divideBy2(num) {
return [num >> 1, num & 1];
}
export function divideBy4(num) {
return [num >> 2, num & 3];
}
export function divideBy8(num) {
return [num >> 3, num & 7];
}
(প্রথমটি ভাগফল, দ্বিতীয়টি বাকী)
function divideByPowerOf2(num, exponent) { return [num >> exponent, num & ((1 << exponent) - 1)]; },।
ইতিবাচক এবং নেতিবাচক পূর্ণসংখ্যার মানগুলি কীভাবে পরিচালনা করতে হয় তার সিদ্ধান্ত নিতে আপনি তিন্নি ব্যবহার করতে পারেন।
var myInt = (y > 0) ? Math.floor(y/x) : Math.floor(y/x) + 1
সংখ্যাটি যদি ইতিবাচক হয় তবে সব ঠিক আছে। সংখ্যাটি যদি negativeণাত্মক হয় তবে এটি ম্যাথ.ফ্লুর নেতিবাচক হ্যান্ডেলগুলির কারণে এটি 1 যুক্ত করবে।
এটি সর্বদা শূন্যের দিকে ছাঁটাবে। এটি খুব দেরি হয়েছে কিনা তা নিশ্চিত নয়, তবে এখানে এটি যায়:
function intdiv(dividend, divisor) {
divisor = divisor - divisor % 1;
if (divisor == 0) throw new Error("division by zero");
dividend = dividend - dividend % 1;
var rem = dividend % divisor;
return {
remainder: rem,
quotient: (dividend - rem) / divisor
};
}
আপনার যদি খুব বড় পূর্ণসংখ্যার জন্য অবশিষ্ট গণনা করতে হয়, যা জেএস রানটাইম যেমন হিসাবে প্রতিনিধিত্ব করতে পারে না (2 ^ 32 এর চেয়ে বড় কোনও পূর্ণসংখ্যাকে একটি ভাসা হিসাবে উপস্থাপন করা হয় এবং সুতরাং এটি নির্ভুলতা হারিয়ে ফেলে) আপনার কিছু কৌশল করতে হবে।
এটি আমাদের প্রতিদিনের জীবনের অনেক ক্ষেত্রে (ব্যাংক অ্যাকাউন্ট নম্বর, ক্রেডিট কার্ড, ...) উপস্থিত চেক ডিজিটের অনেকগুলি ক্ষেত্রে যাচাইয়ের জন্য বিশেষত গুরুত্বপূর্ণ (
সবার আগে আপনার সংখ্যাটি স্ট্রিং হিসাবে প্রয়োজন (অন্যথায় আপনি ইতিমধ্যে নির্ভুলতা হারিয়ে ফেলেছেন এবং বাকী অংশটি বোঝায় না)।
str = '123456789123456789123456789'
আপনার স্ট্রিংটি এখন ছোট অংশগুলিতে বিভক্ত করতে হবে, ছোট ছোট যাতে কোনও অবশিষ্ট অংশের কাঠামো এবং স্ট্রিংয়ের টুকরো 9 টি সংখ্যায় ফিট করতে পারে।
digits = 9 - String(divisor).length
স্ট্রিং বিভক্ত করতে একটি নিয়মিত প্রকাশ প্রস্তুত করুন
splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g')
উদাহরণস্বরূপ, যদি digits7 হয় তবে রেজিপ্সপ হয়
/.{1,7}(?=(.{7})+$)/g
এটি সর্বাধিক দৈর্ঘ্যের of এর একটি অযৌক্তিক স্ট্রিংয়ের সাথে মেলে যা (?=...)একটি ধরণের একাধিক অক্ষরের দ্বারা অনুসরণ করা হয় ( ইতিবাচক চেহারা) 7.. এর 'জি' হ'ল এক্সপ্রেশনটি সমস্ত স্ট্রিংয়ের মাধ্যমে চালানো হয়, প্রথম ম্যাচে থামছে না।
এখন প্রতিটি অংশকে পূর্ণসংখ্যায় রূপান্তর করুন, এবং অবশিষ্টাংশগুলি গণনা করুন reduce(পূর্ববর্তী অবশিষ্টটিকে আবার যোগ করুন - বা 0 - 10 এর সঠিক শক্তি দ্বারা গুণিত):
reducer = (rem, piece) => (rem * Math.pow(10, digits) + piece) % divisor
এটি "বিয়োগ" বাকী অ্যালগোরিদমের কারণে কাজ করবে:
n mod d = (n - kd) mod d
যা চূড়ান্ত বাকী অংশকে প্রভাবিত না করে কোনও সংখ্যার দশমিক দশমিক উপস্থাপনার কোনও 'প্রাথমিক অংশ' প্রতিস্থাপন করতে দেয়।
চূড়ান্ত কোডটি দেখতে হবে:
function remainder(num, div) {
const digits = 9 - String(div).length;
const splitter = new RegExp(`.{1,${digits}}(?=(.{${digits}})+$)`, 'g');
const mult = Math.pow(10, digits);
const reducer = (rem, piece) => (rem * mult + piece) % div;
return str.match(splitter).map(Number).reduce(reducer, 0);
}
3.5 % 21.5 এর মূল্যায়ন করে। প্রয়োজনীয় হিসাবে হ্যান্ডেল (পার্সেন্ট, ফ্লোর, ইত্যাদি) নিশ্চিত করুন