बिना कास्टिंग के डबल से लॉन्ग कैसे कन्वर्ट करें?


191

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

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

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

2
बस यह सुनिश्चित करें कि आप 2 ^ 54 से अधिक के साथ काम नहीं करते हैं या संख्याएं अंश में फिट नहीं होंगी , इसलिए उदाहरणों के लिए जैसे myLong == (long)(myDouble + 1)कि जहाँ myLongसमान myDoubleमूल्यांकन होगाtrue
विटाली फेडोरेंको

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

जवाबों:


250

यह मानते हुए कि आप शून्य की ओर बढ़ते हुए खुश हैं, बस कास्ट करें:

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

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


8
शानदार उत्तर - शून्य भाग की ओर मेरे ऐप के लिए गलत होता, इसलिए आपके उत्तर में इस पर प्रकाश डालने के लिए तालियाँ, और मेरी भूख मस्तिष्क को केवल कास्टिंग के बजाय Math.round () का उपयोग करने की याद दिलाता है!
फैंटमव्हेल

123

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

double d = 1234.56;
long x = Math.round(d); //1235

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

3
हाँ। यह करने के लिए क्या जॉन ने कहा कि :) एक अतिरिक्त के रूप में सोचा गया था
litb - Johannes Schaub

2
मुझे यह पसंद है क्योंकि यह भी आदिम प्रकार के बजाय डबल और लंबी वस्तुओं के साथ काम करता है।
थीनाटुफ़

58

पसंदीदा तरीका होना चाहिए:

Double.valueOf(d).longValue()

से डबल (जावा प्लेटफार्म एसई 7) प्रलेखन :

Double.valueOf(d)

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


36

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


13

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

long DoubleMath.roundToLong(double x, RoundingMode mode)

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


7

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

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());
}

Long is a subset of Doubleसटीक नहीं है। लोंग के लिए महत्वपूर्ण अंकों की संख्या दोगुनी है, इस प्रकार लोंग द्वारा रखी गई कुछ जानकारी डबल में परिवर्तित होने पर खो सकती है। उदाहरण = tio.run/…
थ्रिक नुगरोहोमो

4

क्या आप बाइनरी रूपांतरण करना चाहते हैं?

double result = Double.longBitsToDouble(394.000d);

2
यह पूछा जा रहा है के विपरीत है।
लुकास फिलिप्स

@LucasPhillips तुम सही हो। मुझे सवाल का गलत अर्थ निकालना चाहिए, लेकिन मैं अपना जवाब छोड़ दूंगा क्योंकि यह दूसरों की मदद कर सकता है।
पोवेर्ब

1

बस निम्नलिखित द्वारा:

double d = 394.000;
long l = d * 1L;

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.