2008-11-26 5 views
134

कास्टिंग के बिना डबल से लंबे समय तक परिवर्तित करने का सबसे अच्छा तरीका क्या है?कास्टिंग के बिना डबल से लंबे समय तक कैसे परिवर्तित करें?

उदाहरण के लिए:

double d = 394.000; 
long l = (new Double(d)).longValue(); 
System.out.println("double=" + d + ", long=" + l); 
+2

बस सुनिश्चित करें कि आप डबल्स अधिक से अधिक 2^54 या संख्या में [अंश] फ़िट नहीं होगा के साथ काम नहीं करते (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3), इसलिए उदाहरण के लिए 'myLong == (long) (myDouble + 1)' जैसे अभिव्यक्तियां ' myLong' बराबर 'myDouble'' सत्य ' –

+0

का मूल्यांकन करेगा इस विधि ('Double.longValue();') अभी भी उपयोगी है यदि आपके पास इस' ArrayList 'जैसी सरणीसूची जैसी चीज़ों से दोहरे मान हैं, तो आपको एक मिल जाएगा त्रुटि नहीं डाली जा सकती है। मैं बस यह किसी के लिए कह रहा हूं जो यहां आया था और थोड़ा अलग समस्या थी। – SARose

+0

आपका शीर्षक "डबल से लम्बा रूपांतरण" सही नहीं है, आपके प्रश्न को "लंबे से दोहरे रूपांतरण" शीर्षक की आवश्यकता है। –

उत्तर

193

मान लिया जाये कि आप शून्य की ओर छोटा से खुश हैं, बस डाली:

double d = 1234.56; 
long x = (long) d; // x = 1234 

यह आवरण वर्गों के माध्यम से जा रहा से अधिक तेजी से होगा - और अधिक महत्वपूर्ण बात यह है अधिक पठनीय। अब, यदि आपको "हमेशा शून्य की तरफ" के अलावा गोल करने की आवश्यकता है तो आपको थोड़ा और जटिल कोड की आवश्यकता होगी।

+5

ग्रेट उत्तर - शून्य ऐप की ओर मेरे ऐप के लिए गलत होगा, इसलिए अपने उत्तर में इसे हाइलाइट करने के लिए प्रशंसा करें, और मेरे शिकारी मस्तिष्क को केवल मठ के बजाय Math.round() का उपयोग करने के लिए याद दिलाएं! – Phantomwhale

97

... और यहां गोल करने वाला तरीका है जो छोटा नहीं होता है। जावा एपीआई नियम-पुस्तक में उसे ढूंढने की जल्दबाजी:

double d = 1234.56; 
long x = Math.round(d); 
+0

यह एक कलाकार के रूप में एक ही परिणाम नहीं देता है। तो यह इस बात पर निर्भर करता है कि अमीर क्या करना चाहता है। –

+3

हाँ। यह जॉन ने जो कहा उसके अलावा एक विचार के रूप में सोचा गया था :) –

+2

मुझे यह पसंद है क्योंकि यह प्राचीन प्रकार के बजाय डबल और लांग ऑब्जेक्ट्स के साथ भी काम करता है। – themanatuf

29

(new Double(d)).longValue() आंतरिक रूप से सिर्फ एक डाली करता है, तो वहाँ एक डबल वस्तु बनाने के लिए कोई कारण नहीं है।

0

बस डालें, कास्टिंग एक डबल ऑब्जेक्ट बनाने से अधिक कुशल है।

5

आप

की तरह एक द्विआधारी रूपांतरण है करना चाहते हैं
double result = Double.longBitsToDouble(394.000d); 
+1

यह पूछा जा रहा है कि इसके विपरीत क्या है। –

+0

@ लुकास फिलिप्स आप सही हैं। मैंने इस सवाल को गलत तरीके से पढ़ा होगा, लेकिन मैं अपना जवाब छोड़ दूंगा क्योंकि इससे दूसरों की मदद मिल सकती है। – pvorb

10

अमरूद गणित पुस्तकालय के लिए एक विधि विशेष रूप से एक लंबे को एक डबल परिवर्तित करने के लिए डिजाइन किया गया है:

long DoubleMath.roundToLong(double x, RoundingMode mode) 

आप निर्दिष्ट करने के लिए उपयोग कर सकते हैं java.math.RoundingMode गोल व्यवहार

16

पसंदीदा दृष्टिकोण होना चाहिए:

Double.valueOf(d).longValue() 

Double (Java Platform SE 7) documentation से:

Double.valueOf(d) 

रिटर्न एक Double उदाहरण निर्दिष्ट double मूल्य का प्रतिनिधित्व। यदि कोई नया Double उदाहरण आवश्यक नहीं है, तो इस विधि को को आमतौर पर कन्स्ट्रक्टर Double(double), की प्राथमिकता में उपयोग किया जाना चाहिए क्योंकि यह विधि अक्सर अनुरोधित मानों को कैशिंग करके प्रदर्शन को बेहतर स्थान और समय प्रदान करने की संभावना है।

6

आप एक मजबूत संदेह है कि डबल वास्तव में एक लंबा है, और आप चाहते हैं

1) एक लंबे

2 के रूप में अपनी सही मूल्य पर एक संभाल पाने के) एक त्रुटि जब फेंक तो , तो आप ऐसा

public class NumberUtils { 

    /** 
    * Convert a {@link Double} to a {@link Long}. 
    * Method is for {@link Double}s that are actually {@link Long}s and we just 
    * want to get a handle on it as one. 
    */ 
    public static long getDoubleAsLong(double specifiedNumber) { 
     Assert.isTrue(NumberUtils.isWhole(specifiedNumber)); 
     Assert.isTrue(specifiedNumber <= Long.MAX_VALUE && specifiedNumber >= Long.MIN_VALUE); 
     // we already know its whole and in the Long range 
     return Double.valueOf(specifiedNumber).longValue(); 
    } 

    public static boolean isWhole(double specifiedNumber) { 
     // http://stackoverflow.com/questions/15963895/how-to-check-if-a-double-value-has-no-decimal-part 
     return (specifiedNumber % 1 == 0); 
    } 
} 

लांग डबल के एक सबसेट है: इस तरह अपनी एक लंबी कुछ

तुम कोशिश कर सकते नहीं कुछ अजीब परिणाम प्राप्त हो सकता है अगर आप अनजाने में एक डबल लांग के श्रेणी से बाहर है कि बदलने की कोशिश:

@Test 
public void test() throws Exception { 
    // Confirm that LONG is a subset of DOUBLE, so numbers outside of the range can be problematic 
    Assert.isTrue(Long.MAX_VALUE < Double.MAX_VALUE); 
    Assert.isTrue(Long.MIN_VALUE > -Double.MAX_VALUE); // Not Double.MIN_VALUE => read the Javadocs, Double.MIN_VALUE is the smallest POSITIVE double, not the bottom of the range of values that Double can possible be 

    // Double.longValue() failure due to being out of range => results are the same even though I minus ten 
    System.out.println("Double.valueOf(Double.MAX_VALUE).longValue(): " + Double.valueOf(Double.MAX_VALUE).longValue()); 
    System.out.println("Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + Double.valueOf(Double.MAX_VALUE - 10).longValue()); 

    // casting failure due to being out of range => results are the same even though I minus ten 
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE): " + (long) Double.valueOf(Double.MAX_VALUE).doubleValue()); 
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + (long) Double.valueOf(Double.MAX_VALUE - 10).doubleValue()); 
} 
संबंधित मुद्दे