जवाबों:
कुछ संख्या 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. जिस तरह से डोनाल्ड नूथ की अनुशंसित परिभाषा (साइन-मैच-डिवाइडर, न कि शेष यानी यूक्लिडियन मापांक, और न ही जावास्क्रिप्ट साइन-मैच-डिविडेंड) द्वारा मॉडुलो ऑपरेशन, जिसे हम जावास्क्रिप्ट के रूप में कोड कर सकते हैं function mod (a, n) { return a % n + (Math.sign(a) !== Math.sign(n) ? n : 0); }
।
मैं बिटवाइज़ ऑपरेटरों में कोई विशेषज्ञ नहीं हूँ, लेकिन यहाँ पूरी संख्या पाने का एक और तरीका है:
var num = ~~(a / b);
यह नकारात्मक संख्याओं के लिए ठीक से काम करेगा, जबकि 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
बेहतर समझ पाएंगे । और अगर नहीं भी है, तो भी यह एक देखने योग्य है।
ईएस 6 नई Math.trunc
विधि का परिचय देता है । यह @ MarkElliot के उत्तर को ठीक करने की अनुमति देता है ताकि वह नकारात्मक संख्याओं के लिए भी काम कर सके:
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
parseInt में स्ट्रिंग्स के साथ कुछ नुकसान हैं, बेस 10 के साथ रेडिक्स पैरामीटर का उपयोग करने से बचें
parseInt("09", 10)
कुछ मामलों में संख्या का स्ट्रिंग प्रतिनिधित्व एक वैज्ञानिक संकेतन हो सकता है, इस मामले में, parseInt गलत परिणाम देगा।
parseInt(100000000000000000000000000000000, 10) // 1e+32
यह कॉल परिणाम के रूप में 1 का उत्पादन करेगा।
parseInt
जब संभव हो तो बचना चाहिए। यहां डगलस क्रॉफोर्ड की चेतावनी है: "यदि स्ट्रिंग का पहला वर्ण 0 है, तो स्ट्रिंग का आधार 8 के बजाय बेस 8 में मूल्यांकन किया जाता है। बेस 8, 8 और 9 में अंक नहीं हैं, इसलिए parseInt (" 08 ") और parseInt ("09") उनके परिणाम के रूप में 0 का उत्पादन करता है। यह त्रुटि उन कार्यक्रमों में समस्याओं का कारण बनती है जो दिनांक और समय को पार्स करते हैं। सौभाग्य से, parseInt एक मूलांक पैरामीटर ले सकता है, जिससे कि parseInt ("08", 10) 8 का उत्पादन करता है। मैं अनुशंसा करता हूं कि हमेशा मूलांक पैरामीटर प्रदान करें। " आर्काइव .oreilly.com
parseInt
इससे बचना चाहिए; बस इतना है कि वहाँ कुछ getchas के बारे में पता कर रहे हैं। आपको इन बातों के बारे में पता होना चाहिए और सामना करने के लिए तैयार रहना चाहिए।
parseInt
एक नंबर की दलील के साथ फोन न करें । parseInt
आंशिक रूप से संख्यात्मक स्ट्रिंग को पार्स करने के लिए माना जाता है, न कि संख्याओं को कम करने के लिए।
जावास्क्रिप्ट उनके लिए गणितीय परिभाषाओं का पालन करते हुए, नकारात्मक संख्याओं के तल और गैर-पूर्णांक संख्याओं के शेष की सही गणना करता है।
FLOOR को "पैरामीटर से छोटा सबसे बड़ा पूर्णांक संख्या" के रूप में परिभाषित किया गया है, इस प्रकार:
रिमाइंडर को एक डिवीजन (यूक्लिडियन अंकगणित) के "बाएं ओवर" के रूप में परिभाषित किया गया है। जब लाभांश पूर्णांक नहीं होता है, तो भागफल आमतौर पर पूर्णांक भी नहीं होता है, अर्थात, शेष नहीं है, लेकिन यदि भागफल को पूर्णांक बनने के लिए मजबूर किया जाता है (और ऐसा तब होता है जब कोई व्यक्ति शेष या मापांक प्राप्त करने की कोशिश करता है। फ्लोटिंग-पॉइंट नंबर), एक गैर-पूर्णांक "बचे हुए ओवर" होगा, जाहिर है।
जावास्क्रिप्ट उम्मीद के अनुसार सब कुछ की गणना करता है, इसलिए प्रोग्रामर को उचित प्रश्न पूछने के लिए सावधान रहना चाहिए (और लोगों को जवाब देने के लिए सावधानी बरतनी चाहिए!) यारिन का पहला सवाल "वाई द्वारा एक्स का पूर्णांक विभाजन नहीं था", लेकिन, इसके बजाय, "किसी दिए गए पूर्णांक की दूसरी संख्या कितनी बार होती है"। सकारात्मक संख्याओं के लिए, उत्तर दोनों के लिए समान है, लेकिन नकारात्मक संख्याओं के लिए नहीं, क्योंकि पूर्णांक विभाजन (भाजक द्वारा लाभांश) संख्या (भाजक) की तुलना में -1 छोटा होगा "जो" दूसरे (लाभांश) में जाता है। दूसरे शब्दों में, FLOOR एक ऋणात्मक संख्या के पूर्णांक विभाजन के लिए सही उत्तर देगा, लेकिन यारिन ने यह नहीं पूछा!
गैमैक्स ने सही उत्तर दिया, वह कोड यारिन द्वारा पूछे गए अनुसार काम करता है। दूसरी ओर, शमूएल गलत है, उसने गणित नहीं किया, मुझे लगता है, या उसने देखा होगा कि यह काम करता है (यह भी, उसने यह नहीं कहा कि उसके उदाहरण का विभाजक क्या था, लेकिन मुझे उम्मीद है कि यह होगा) 3):
शेष = X% Y = -100% 3 = -1
GoesInto = (X - शेष) / Y = (-100 - -1) / 3 = -99 / 3 = -33
वैसे, मैंने फ़ायरफ़ॉक्स 27.0.1 पर कोड का परीक्षण किया, यह उम्मीद के मुताबिक काम किया, सकारात्मक और नकारात्मक संख्याओं के साथ और गैर-पूर्णांक मानों के साथ, लाभांश और विभाजक दोनों के लिए। उदाहरण:
-100.34 / 3.57: GoesInto = -28, शेष = -0.30000000000000079
हां, मैंने देखा, वहां एक सटीक समस्या है, लेकिन मेरे पास इसे जांचने का समय नहीं था (मुझे नहीं पता कि यह फ़ायरफ़ॉक्स, विंडोज 7 या मेरे सीपीयू के एफपीयू के साथ कोई समस्या है)। यारिन के प्रश्न के लिए, हालांकि, जिसमें केवल पूर्णांक शामिल हैं, गैमैक्स का कोड पूरी तरह से काम करता है।
पृष्ठों की संख्या की गणना एक चरण में की जा सकती है: Math.ceil (x / y)
एलेक्स मूर-नीमी की टिप्पणी एक जवाब के रूप में:
रूबिस्टों के लिए यहाँ Google से 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
यदि संख्या एक सकारात्मक है, तो सब ठीक है। यदि संख्या एक ऋणात्मक है, तो यह 1 जोड़ देगा क्योंकि Math.floor नकारात्मक को कैसे संभालता है।
यह हमेशा शून्य की ओर बढ़ता जाएगा। यकीन नहीं तो बहुत देर हो जाएगी, लेकिन यहाँ यह हो जाता है:
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')
उदाहरण के लिए, यदि digits
7 है, तो रेगेक्सप है
/.{1,7}(?=(.{7})+$)/g
यह अधिकतम लंबाई 7 के एक गैर-रिक्त विकल्प से मेल खाता है, जिसका अनुसरण ( (?=...)
एक सकारात्मक रूपांतर है) कई वर्णों द्वारा किया जाता है जो 7. से अधिक है। 'g' का अर्थ है कि सभी स्ट्रिंग के माध्यम से रन बनाना, पहले मैच में नहीं रुकना।
अब प्रत्येक भाग को पूर्णांक में बदलें, और reduce
पिछले ( शेष को वापस जोड़ते हुए - 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 % 2
1.5 का मूल्यांकन करता है। आवश्यकतानुसार संभालना (पार्सइंट, फ्लोर इत्यादि) सुनिश्चित करें