जवाबों:
आप कर रहे हैं 157/32
जो दो पूर्णांकों को एक दूसरे के साथ विभाजित कर रहा है, जिसके परिणामस्वरूप हमेशा पूर्णांक नीचे गोल होता है। इसलिए (int) Math.ceil(...)
कुछ भी नहीं कर रहा है। आप जो चाहते हैं उसे प्राप्त करने के लिए तीन संभावित उपाय हैं। मैं विकल्प 1 या विकल्प 2 का उपयोग करने की सलाह देता हूं । कृपया विकल्प 0 का उपयोग न करें ।
## विकल्प 0
कन्वर्ट a
और b
एक डबल करने के लिए, और आप विभाजन का उपयोग कर सकते हैं और Math.ceil
जैसा कि आप इसे काम करना चाहते थे। हालांकि मैं इस दृष्टिकोण के उपयोग को दृढ़ता से हतोत्साहित करता हूं, क्योंकि दोहरे विभाजन को लागू किया जा सकता है। युगल के दबदबे के बारे में अधिक पढ़ने के लिए यह प्रश्न देखें ।
int n = (int) Math.ceil((double) a / b));
##विकल्प 1
int n = a / b + ((a % b == 0) ? 0 : 1);
आप a / b
हमेशा फर्श के साथ करते हैं अगर a
और b
दोनों पूर्णांक हैं। फिर आपके पास एक इनलाइन है यदि स्टेटमेंट चुड़ैल जाँचती है कि आपको फर्श के बजाय छत पर जाना चाहिए या नहीं। तो +1 या +0, यदि विभाजन के साथ शेष है तो आपको +1 की आवश्यकता होगी। a % b == 0
शेष के लिए जाँच करता है।
##विकल्प 2
यह विकल्प बहुत कम है, लेकिन शायद कुछ कम सहज ज्ञान के लिए। मुझे लगता है कि यह कम सहज दृष्टिकोण दोहरे विभाजन और तुलनात्मक दृष्टिकोण से तेज होगा:
कृपया ध्यान दें कि यह काम नहीं करता है b < 0
।
int n = (a + b - 1) / b;
अतिप्रवाह की संभावना को कम करने के लिए आप निम्नलिखित का उपयोग कर सकते हैं। हालाँकि कृपया ध्यान दें कि यह a = 0
और के लिए काम नहीं करता है b < 1
।
int n = (a - 1) / b + 1;
## "कम सहज दृष्टिकोण" के पीछे स्पष्टीकरण
जावा (और अधिकांश अन्य प्रोग्रामिंग भाषाओं) में दो पूर्णांक को विभाजित करने के बाद से परिणाम हमेशा सामने आएगा। इसलिए:
int a, b;
int result = a/b (is the same as floor(a/b) )
लेकिन हम विकिपीडिया से परिभाषाओं और भूखंडों का उपयोग नहीं करना चाहते floor(a/b)
, लेकिन :ceil(a/b)
मंजिल और छत समारोह के इन भूखंडों के साथ आप संबंध देख सकते हैं।
आप वह देख सकते हैं floor(x) <= ceil(x)
। हमें चाहिए floor(x + s) = ceil(x)
। इसलिए हमें खोजने की जरूरत है s
। अगर हम लेते हैं तो 1/2 <= s < 1
यह सही होगा (कुछ संख्याओं को आज़माएँ और आप देखेंगे कि यह ऐसा करता है, मुझे यह साबित करने के लिए खुद को कठिन लगता है)। और 1/2 <= (b-1) / b < 1
, इसलिए
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
यह एक वास्तविक प्रमाण नहीं है, लेकिन मुझे आशा है कि आपके इससे संतुष्ट हैं। अगर कोई इसे बेहतर तरीके से समझा सकता है तो मैं भी इसकी सराहना करूंगा। शायद यह MathOverflow पर पूछें ।
157/32 है int/int
, जिसके परिणामस्वरूप ए int
।
डबल शाब्दिक का उपयोग करने का प्रयास करें - 157/32d
, जो है int/double
, जिसके परिणामस्वरूप ए double
।
157/32
एक पूर्णांक विभाजन है क्योंकि सभी संख्यात्मक शाब्दिक पूर्णांक हैं जब तक कि एक प्रत्यय के साथ निर्दिष्ट नहीं किया जाता है ( लंबे समय के d
लिए दोगुना l
)
विभाजन को नीचे (4 से) गोल किया जाता है, इससे पहले कि यह एक डबल (4.0) में परिवर्तित हो जाए जो बाद में गोल (4.0) हो जाता है
यदि आप एक चर का उपयोग करते हैं तो आप इससे बच सकते हैं
double a1=157;
double a2=32;
int total = (int) Math.ceil(a1/a2);
किसी ने भी सबसे सहज का उल्लेख नहीं किया है:
int x = (int) Math.round(Math.ceil((double) 157 / 32));
यह घोल डबल डिविजन इंप्रेशन को ठीक करता है ।
जावा में एक .0 जोड़ने से यह एक डबल हो जाएगा ...
int total = (int) Math.ceil(157.0 / 32.0);
दो पूर्णांकों को विभाजित करते समय, जैसे,
int c = (int) a / (int) b;
परिणाम एक है int
, जिसका मूल्य शून्य से गोल a
करके विभाजित है b
। क्योंकि परिणाम पहले से ही गोल है, ceil()
कुछ भी नहीं करता है। ध्यान दें कि यह गोलाई समान नहीं है floor()
, जो नकारात्मक अनंत की ओर घूमती है। तो, 3/2
बराबर 1
(और floor(1.5)
बराबर 1.0
, लेकिन (-3)/2
बराबर -1
(लेकिन floor(-1.5)
बराबर -2.0
)।
यह महत्वपूर्ण है क्योंकि अगर a/b
हमेशा की तरह ही थे floor(a / (double) b)
, तो आप बस ceil()
के a/b
रूप में लागू कर सकते हैं -( (-a) / b)
।
होने का सुझाव ceil(a/b)
से
int n = (a + b - 1) / b;
, जो के बराबर है a / b + (b - 1) / b
, या(a - 1) / b + 1
काम करता है क्योंकि ceil(a/b)
हमेशा एक से अधिक है floor(a/b)
, सिवाय जब a/b
एक पूरी संख्या है। इसलिए, आप इसे अगले पूरे नंबर पर (या पिछले) पर टक्कर देना चाहते हैं, जब तक a/b
कि पूरी संख्या न हो। जोड़ना 1 - 1 / b
यह कर देगा। संपूर्ण संख्याओं के लिए, यह उन्हें अगली पूरी संख्या तक नहीं पहुंचाएगा। बाकी सब कुछ के लिए, यह होगा।
ओह। उम्मीद है कि समझ में आता है। मुझे यकीन है कि इसे समझाने के लिए एक और अधिक गणितीय तरीका है।
किसी संख्या को पूर्णांक से वास्तविक संख्या में बदलने के लिए आप एक बिंदु जोड़ सकते हैं:
int total = (int) Math.ceil(157/32.);
और (157/32।) का परिणाम भी वास्तविक होगा। ;)
जावा /
डिफ़ॉल्ट रूप से केवल फ्लोर डिवीजन प्रदान करता है । लेकिन हम फर्श के संदर्भ में छत लिख सकते हैं । चलो देखते हैं:
y
फॉर्म के साथ कोई भी पूर्णांक लिखा जा सकता है y == q*k+r
। फर्श विभाजन की परिभाषा के अनुसार (यहां floor
) जो गोल होता है r
,
floor(q*k+r, k) == q , where 0 ≤ r ≤ k-1
और सीलिंग डिवीजन (यहां ceil
) जो गोल है r₁
,
ceil(q*k+r₁, k) == q+1 , where 1 ≤ r₁ ≤ k
जहां हम स्थानापन्न कर सकते हैं r+1
के लिए r₁
:
ceil(q*k+r+1, k) == q+1 , where 0 ≤ r ≤ k-1
फिर हम तीसरे में पहले समीकरण स्थानापन्न के लिए q
हो रही है
ceil(q*k+r+1, k) == floor(q*k+r, k) + 1 , where 0 ≤ r ≤ k-1
अंत में, किसी भी पूर्णांक दिया y
जहां y = q*k+r+1
कुछ के लिए q
, k
, r
, हमारे पास है
ceil(y, k) == floor(y-1, k) + 1
और हम कर रहे हैं। उम्मीद है की यह मदद करेगा।
ceil
यह मेरे लिए स्पष्ट नहीं है कि इस तरह की अंतरंग परिभाषा से क्यों परिभाषित किया गया है, विशेष रूप से जहां हम एक पूर्णांक की छत ले रहे हैं, अर्थात r1 = k। चूंकि किनारे के मामले इस बारे में मुश्किल हैं, इसलिए मुझे लगता है कि इसे थोड़ा और समझने की जरूरत है।
ऐसी दो विधियाँ हैं जिनके द्वारा आप अपने दोहरे मान को बढ़ा सकते हैं।
यदि आप अपना उत्तर 4.90625 4 के रूप में चाहते हैं, तो आपको Math.floor का उपयोग करना चाहिए और यदि आप अपना उत्तर 4.90625 5 के रूप में चाहते हैं, तो आप Math.ceil का उपयोग कर सकते हैं
आप उसके लिए निम्न कोड का उल्लेख कर सकते हैं।
public class TestClass {
public static void main(String[] args) {
int floorValue = (int) Math.floor((double)157 / 32);
int ceilValue = (int) Math.ceil((double)157 / 32);
System.out.println("Floor: "+floorValue);
System.out.println("Ceil: "+ceilValue);
}
}
int total = (157-1)/32 + 1
या अधिक सामान्य
(a-1)/b +1