2012-02-17 8 views
13

एक पूर्णांक के बराबर एक डबल हमेशा उस पूर्णांक पर डाला जाएगा (माना जाता है कि डबल एक ऐसा नहीं है जो अतिप्रवाह का कारण बनता है)। उदाहरण: Math.ceil() एक पूर्णांक के बराबर एक डबल लौटाएगा। कोई ओवरफ्लो मानते हुए, क्या यह हमेशा एक ही पूर्णांक में डाला जाएगा जो माना जाता है कि यह बराबर है?एक पूर्णांक के बराबर एक डबल हमेशा उस पूर्णांक में डाला जाएगा?

यदि नहीं, तो मैं double को int या long पर कैसे गोल कर सकता हूं?

+0

+1: दिलचस्प सवाल। मुझे लगता है कि जवाब "हां" है, लेकिन कुछ किनारे के मामले हो सकते हैं जिन्हें मैंने नहीं माना है। –

उत्तर

9

के बाद से जावा प्रकार तय कर रहे हैं और Java doubles have a 52 bit mantissa, वे (आसानी से) गोलाई के बिना एक 32-बिट जावा पूर्णांक प्रतिनिधित्व कर सकते हैं।

+4

मंटिसा 53 का प्रतिनिधित्व करता है शीर्ष बिट के रूप में बिट्स 1 होने के लिए निहित है। –

1

मैं इतना विश्वास है, लेकिन आप इसे अपने आप को परीक्षण कर सकता है:

public static void main(String... args) throws Exception { 
    int interactions = Integer.MAX_VALUE; 
    int i = Integer.MIN_VALUE; 
    double d = Integer.MIN_VALUE; 
    long init = System.currentTimeMillis(); 
    for (; i < interactions; i++, d++) 
     if (!(i == (int) Math.ceil(d))) 
      throw new Exception("something went wrong with i=" + i + " and d=" + d + ", Math.ceil(d)="+Math.ceil(d)); 

    System.out.println("Finished in: "+(System.currentTimeMillis() - init)+"ms"); 
} 
+0

मुझे पूरा यकीन है कि यदि आप लंबे समय तक ऐसा करते हैं तो आपकी राउंडिंग त्रुटि एक समस्या का कारण बन जाएगी। (यानी 0.1 के रूप में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है) –

+0

-1 इस तरह के उत्थान के लिए अनुभवजन्य परीक्षणों का उपयोग करना बुरा है क्योंकि ज्यादातर मामलों में यह गलत निष्कर्ष निकाल देगा। –

1

सभी संभव int मूल्यों त्रुटि के बिना एक डबल द्वारा दर्शाया जा सकता। राउंड अप करने का सबसे आसान तरीका Math.ceil() उदा।

double d = 
long l = (long) Math.ceil(d); // note: could overflow. 
+3

सभी 'int' मान, सभी 'लंबे' मान नहीं कर सकते हैं। –

1

अनुभव से, जवाब है हां प्रतीत हो रहा है - ध्यान दें कि यह भी i2 = (int) d; साथ काम करता है।

public static void main(String[] args) { 
    for (int i = Integer.MIN_VALUE + 1; i < Integer.MAX_VALUE; i++) { 
     double d = i; 
     int i2 = (int) Math.ceil(d); 
     if (i != i2) { 
      System.out.println("i=" + i + " and i2=" + i2); //Never executed 
     } 
    } 
} 
+0

आपको नकारात्मक संख्या भी आजमाने की जरूरत है लेकिन वे भी काम करते हैं। –

+0

इंटीजर से शुरू करने के लिए संशोधित .MIN_VALUE – assylias

+0

-1 इस तरह के इटैरेक्शन के लिए अनुभवजन्य परीक्षणों का उपयोग करना बुरा है क्योंकि यह ज्यादातर मामलों में गलत निष्कर्ष प्रदान करेगा। –

6

हां, यह बिल्कुल परिवर्तित हो जाएगा। यह JLS, जो

का उल्लेख है अन्यथा, यदि फ्लोटिंग प्वाइंट नंबर एक अनन्तता नहीं है की Section 5.1.3 में वर्णन किया गया, फ्लोटिंग प्वाइंट मान एक पूर्णांक मूल्य वी के लिए गोल है, शून्य आईईईई का उपयोग कर की ओर गोलाई 754 राउंड की ओर शून्य मोड ...

अपने double के बाद से वास्तव में int, "गोल" मान बस ठीक उसी मूल्य है के बराबर होती है, लेकिन आप जानकारी के लिए कल्पना पढ़ सकते हैं।