2011-09-16 9 views
59

मैं सिर्फ सेल फोन एसएमएस के लिए पृष्ठों की संख्या गिनती करने के लिए एक छोटे से विधि लिखा था। मेरे पास Math.ceil का उपयोग करके गोल करने का विकल्प नहीं था, और ईमानदारी से यह बहुत बदसूरत प्रतीत होता है।पूर्णांक विभाजन को कैसे पूर्ण करें और जावा में int परिणाम प्राप्त करें?

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    String message = "today we stumbled upon a huge performance leak while optimizing a raycasting algorithm. Much to our surprise, the Math.floor() method took almost half of the calculation time: 3 floor operations took the same amount of time as one trilinear interpolation. Since we could not belive that the floor-method could produce such a enourmous overhead, we wrote a small test program that reproduce"; 

    System.out.printf("COunt is %d ",(int)messagePageCount(message)); 



} 

public static double messagePageCount(String message){ 
    if(message.trim().isEmpty() || message.trim().length() == 0){ 
     return 0; 
    } else{ 
     if(message.length() <= 160){ 
      return 1; 
     } else { 
      return Math.ceil((double)message.length()/153); 
     } 
    } 
} 

मैं वास्तव में नहीं है कोड के इस टुकड़े की तरह है और मैं ऐसा करने का एक और अधिक सुरुचिपूर्ण तरीके के लिए देख रहा हूँ:

यहाँ मेरी कोड है। इसके साथ, मैं 3 की उम्मीद कर रहा हूं और 3.0000000 नहीं। कोई विचार?

+1

[पूर्णांक डिवीजन के परिणाम को ख़त्म कर कैसे] (http के संभावित डुप्लिकेट: // stackoverflow।कॉम/प्रश्न/17 9 44/कैसे-टू-राउंड-अप-द-परिणाम-का-पूर्णांक-विभाजन) – Raedwald

उत्तर

79

एक पूर्णांक विभाजन आप

import static java.lang.Math.abs; 

public static long roundUp(long num, long divisor) { 
    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1); 
    return sign * (abs(num) + abs(divisor) - 1)/abs(divisor); 
} 

उपयोग कर सकते हैं दौर के लिए या यदि दोनों संख्या सकारात्मक

public static long roundUp(long num, long divisor) { 
    return (num + divisor - 1)/divisor; 
} 
+0

ध्यान दें कि यह केवल 'num> = 0' के लिए काम करता है। – user905686

+0

यह सकारात्मक अनंतता के लिए गोल है। यह शून्य से दूर नहीं है जो एक और विकल्प है। –

+2

मेरा मतलब है, 'num = -2' और' div = -3' आज़माएं। यह '-6/-3 = 2' में समाप्त होता है लेकिन '0,666..' को' 1' 'तक गोल किया जाना चाहिए। वास्तव में यह 'num <= 0 && div <= 0' के लिए काम नहीं करता है। – user905686

10
(message.length() + 152)/153 

यह "गोलाकार" पूर्णांक प्रदान करेगा।

0

हैं इस मददगार हो सकता है ,, legnth के शेष के घटाएँ और बनाने के लिए यह एक विभाजित संख्या और फिर इसे 153

int r=message.length()%153;  //Calculate the remainder by %153 
return (message.length()-r)/153; // find the pages by adding the remainder and 
            //then divide by 153 
1

पूर्व के साथ विभाजित करें

public static long divideAndRoundUp(long num, long divisor) { 
    if (num == 0 || divisor == 0) { return 0; } 

    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1); 

    if (sign > 0) { 
     return (num + divisor - 1)/divisor; 
    } 
    else { 
     return (num/divisor); 
    } 
} 
+0

शून्य से विभाजित शून्य नहीं है, लेकिन एक त्रुटि होनी चाहिए। –

95

उपयोग Math.ceil() और int करने के लिए परिणाम डाली:

  • यह अभी भी तेजी से होता है पीटर के समाधान के panding, यह मैं हमेशा मेरे लिए 'सकारात्मक अनंत की ओर' दौर के लिए काम करता है क्या पाया है है abs() का उपयोग करके युगल से बचने के लिए।
  • परिणाम, जब नकारात्मक के साथ काम करने के लिए सही है, क्योंकि -0.999 को 0

उदाहरण तक बढ़ा दिया जाएगा:

(int) Math.ceil((double)divident/divisor); 
+3

यह सही उत्तर होना चाहिए – Duane

+1

@ डुएन ओपी का कहना है, "मेरे पास Math.ceil का उपयोग करके गोल करने का विकल्प नहीं था" – Hemmels

+0

उचित बिंदु, हालांकि मुझे लगता है कि यह अब शीर्ष पर "गणित दौर" हिट है :) । शर्म की बात है कि उस पर हालत है। इनबिल्ट फ़ंक्शंस का उपयोग करने के लिए – Duane

6
long numberOfPages = new BigDecimal(resultsSize).divide(new BigDecimal(pageSize), RoundingMode.UP).longValue(); 
+0

+1 –

21

एक और एक-लाइनर वह भी जटिल नहीं है:

private int countNumberOfPages(int numberOfObjects, int pageSize) { 
    return numberOfObjects/pageSize + (numberOfObjects % pageSize == 0 ? 0 : 1); 
} 

पूर्णांक की लंबी बजाय इस्तेमाल कर सकता; बस पैरामीटर प्रकार और वापसी प्रकार बदलें।

+2

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

+0

अच्छा समाधान। धन्यवाद – ghui

1

आप एक ख से विभाजित को गिरफ्तार आप उपयोग कर सकते हैं गणना करने के लिए चाहते हैं (अ + (- एक% ख))/b

0

यदि आप कुछ भी नहीं आयात करना चाहते हैं, मैं इस सुझाव देते हैं:

int var = message.length()/153; //you can put any integer instead of 153 depend on your case 
if(message.length() % 153 != 0) 
    var = var + 1; 
8

गूगल के अमरूद पुस्तकालय handles this in the IntMath class:

IntMath.divide(numerator, divisor, RoundingMode.CEILING); 

यहाँ कई जवाब के विपरीत, यह ऋणात्मक संख्याओं को संभालती है। शून्य से विभाजित करने का प्रयास करते समय यह एक उचित अपवाद भी फेंकता है।

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