2009-07-02 7 views
16

क्या कोई जावा फ़ंक्शन या class उपयोग करता है जो इस तरह से घूमता है: func(3/2) = 2क्या कोई जावा फ़ंक्शन या उपयोग कक्षा है जो इस तरह से घूमती है: func (3/2) = 2?

Math.ceil() मदद नहीं करता है, जो नाम से ऐसा होना चाहिए था। मैं BigDecimal से अवगत हूं, लेकिन इसकी आवश्यकता नहीं है।

+0

धन्यवाद हर एक, –

+3

क्या आप केवल 0.5 के आसपास की तलाश कर रहे हैं? या 0.3 ऊपर गोल, आदि? – jvenema

+0

@jvenema: बिल्कुल - प्रस्तावित समाधानों में से अधिकांश 1.0 से अधिक कुछ मानना ​​चाहिए 2. उदाहरण के लिए, 7/3 2.333 है लेकिन 3 तक होगा। हालांकि, ओपी से उदाहरण दिया गया है, यह स्पष्ट नहीं है कि यह वांछित है या नहीं या नहीं। – GalacticCowboy

उत्तर

50

Math.ceil() हमेशा ऊपर दौर जाएगा, हालांकि आप 3/2 साथ पूर्णांक विभाजन कर रहे हैं। इस प्रकार, चूंकि पूर्णांक विभाजन 3/2 = 1 (1.5 नहीं) 1 की छत 1 है।

आप इच्छित परिणाम प्राप्त करने के लिए क्या करने की जरूरत होगी क्या Math.ceil(3/2.0);

है एक डबल राशि (2.0), आप चल बिन्दु के बजाय विभाजन पूर्णांक विभाजन कर रही अंत से विभाजन करने से। इस प्रकार 3/2.0 = 1.5, और ceil()1.5 हमेशा 2 है।

4

इसे पूर्णांक विभाजन का सामान्य मामला बताएं? किसी भी संख्या को फ़्लोटिंग पॉइंट प्रकार पर कास्टिंग करने के बाद Math.Ceil आज़माएं।

+1

3/2 पहले से ही केवल 1 (एक int) देता है, इसलिए Math.ceil() कुछ भी नहीं करता है।+1 – AlbertoPL

+0

इंटीजर डिवीजन सबसे बड़ी संख्या देता है जो समान रूप से विभाजित होता है। शेष प्राप्त करने के लिए आपको मॉड्यूलस का उपयोग करने की अनुमति है। – Brian

11

तुम हमेशा पहले डाली कर सकते हैं:

Math.ceil((double)3/2) 
2

Math.ceil सहायता होगी, बशर्ते आप फ़्लोटिंग पॉइंट नंबरों का उपयोग करें। समस्या यह है कि 3/2, पूर्णांक विभाजन में, 1 है। जब तक मूल्य जो भी कार्य करता है, तब तक यह Math.ceil या कुछ और हो, मान बस है 1. कोई पिछला दशमलव भाग चला गया है।

38

काला जादू का एक बिट, और आप इसे सभी पूर्णांकों के साथ क्या कर सकते हैं:

// Divide x by n rounding up 
int res = (x+n-1)/n 
+11

मान लीजिए एक्स सकारात्मक है! – Niki

+0

मुझे वास्तव में इस विधि को और अधिक पसंद है क्योंकि मुझे गणित, कास्ट इत्यादि आयात करने की आवश्यकता नहीं है .. धन्यवाद! – Mat

+2

@Mat दूसरी ओर आपके कोड को पढ़ने वाले किसी को यह पता लगाना मुश्किल होगा कि आप क्या कर रहे थे और क्यों। आपके द्वारा सूचीबद्ध किसी भी व्यक्ति की तुलना में ऐसा करने के खिलाफ यह एक बहुत ही मजबूत तर्क है। हालांकि आप इसे उचित तरीके से नामित विधि में निकाल सकते हैं और फिर यह ठीक है। – biziclop

-2

आप Math.floor() की कोशिश की?

+2

यह वही है जो वह चाहता है। – Brian

5

जावा में, 3/2 = 1 क्योंकि यह पूर्णांक विभाजन का उपयोग करता है। ऐसा कोई फ़ंक्शन नहीं है जो बाद में "ठीक" कर सके।

int result = (int)Math.ceil(((float)3)/((float)2)); 
3

कई भाषाओं इस तरह "लगता है कि": क्या आप क्या करना है एक नाव विभाजन बल और परिणाम को ख़त्म कर रहा है। यदि आप एक int में int को विभाजित कर रहे हैं, तो आपको एक int प्राप्त करना चाहिए (इसलिए वे छेड़छाड़ करते हैं और परिणामस्वरूप आपको 1 मिलता है)।

हम सभी जानते हैं कि यह सच नहीं है, लेकिन इस तरह वे काम करते हैं। आप उन्हें "धोखा" कर सकते हैं, और उनमें से एक को डबल में डालने की तरह कुछ कर सकते हैं, या दोहरा प्रतिनिधित्व का उपयोग कर सकते हैं: Math.ceil (3.0/2) या Math.ceil((double)3/2), जैसा कि बताया गया है।

1
if (a % b == 0) 
{ 
    return (a/b); 
} 
else 
{ 
    return (a/b) + 1; 
} 

जो भी आप चाहते हैं उसे करने के लिए पूर्णांक विभाजन का पता लगाता है। मुझे गणित के बारे में पता नहीं है जो ऐसा करता है, लेकिन क्यों अपना खुद का रोल नहीं?

+0

"अपना खुद का रोल क्यों न करें"? कोड की पठनीयता की वजह से । – NeplatnyUdaj

9

छत विभाजन करने के लिए फर्श विभाजन बदलने के लिए:

(numerator + (denominator)/2)/denominator 
+0

सबसे पहले इसके बराबर है: 'छत (एन/डी) = फ्लो ((एन -1)/डी) + 1' –

1
टुकड़ा नीचे

रूप में अच्छी तरह नकारात्मक पूर्णांक के साथ काम करता है::

public static int divRoundUp(int x, int n) { 
    if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")"); 
    int ret = (x+(n-1)*(x>0?1:0))/n; 
    return ret; 
} 
0

(numerator + denominator-1)/denominator 

गोलाई विभाजन करने के लिए फर्श विभाजन परिवर्तित करने के लिए मुझे रैंडी प्रोक्टर का जवाब सबसे अच्छा लगता है। यहाँ और अधिक विस्तार से:

आप वास्तविक पूर्णांकन (अर्थात 3/2 -> 2, लेकिन 17/7 -> 2) करना चाहते हैं तो पूर्णांकों> 0 के साथ: उपयोग dividend/divisor के बजाय (dividend + (divisor/2))/divisor

यदि लाभांश कोई पूर्णांक हो सकता है (यानी ऋणात्मक अनुमत): (dividend >= 0) ? ((dividend + divisor/2)/divisor) : ((dividend - divisor/2)/divisor)

यदि लाभांश कोई पूर्णांक और विभाजक कोई पूर्णांक है लेकिन 0: (dividend >= 0) ? ((dividend + Math.abs(divisor)/2)/divisor) : ((dividend - Math.abs(divisor)/2)/divisor)

(ध्यान दें कि इसके अलावा और घटाव एक wraparound कि अन्यथा, घटित नहीं परिणाम गलत प्रतिपादन होगा हो सकता है।)

0

यहाँ एक विधि गणित दौर का उपयोग कर और फ्लोट करने के लिए कास्टिंग के बिना मैं पूर्णांक विभाजन को संभालने के लिए बनाया है । यह सकारात्मक और नकारात्मक संख्याओं के लिए काम करता है। यह विभाजक के आधे जोड़कर काम करता है

public static int div_Int(int num, int den){ 
    if(num > 0 && den > 0 || num < 0 && den < 0){ 
     return ((2*num)+ den)/(2*den); 
    }else{ 
     return ((2*num)- den)/(2*den); 
    } 

} 
0

नीचे गोलाई तुम सिर्फ 2 से विभाजित करना चाहते हैं ऑफसेट करने के लिए, आप कर सकते हैं:

n - n/2 

और सामान्य रूप में:

(n - 1)/d + 1 == (n + d - 1)/d 

यह गैर-ऋणात्मक पूर्णांक के लिए है। इसे नकारात्मक पूर्णांक तक कैसे बढ़ाया जाए, इस पर निर्भर करता है कि "इस तरह से घूमने" के साथ आपका क्या मतलब है। इंटीजर डिवीजन शून्य की तरफ गोल है, जबकि Math.ceil() राउंड अप और Math.floor() राउंड डाउन। उदाहरण के लिए n/2 != (int) Math.floor(n/2.0)n == -5 के लिए।

यदि आप हमेशा गोल करना चाहते हैं, तो आप this answer में Math.ceil() का उपयोग कर सकते हैं।

संबंधित मुद्दे