जावा में इंटिजर के लिए डबल कास्ट करें


348

किसी भी तरह से करने के java.lang.Doubleलिए java.lang.Integer?

यह एक अपवाद फेंकता है

"java.lang.ClassCastException: java.lang.Double असंगत java.lang.Integer के साथ"

जवाबों:


464

Doubleनहीं है Integer, इसलिए कलाकार काम नहीं करेंगे। Double वर्ग और double आदिम के बीच अंतर पर ध्यान दें । यह भी ध्यान दें कि a एक Doubleहै Number, इसलिए इसमें वह विधि है intValue , जिसका उपयोग आप मूल्य को एक आदिम के रूप में प्राप्त करने के लिए कर सकते हैं int


2
ठीक है नहीं डाली। मुझे उदाहरण के लिए, 13.22222 नहीं, बल्कि 13 से इंटीजर ऑब्जेक्ट प्राप्त करने की आवश्यकता है।
4lex1v

181
बस intValue()फिर बुलाओ ।
19

6
नल को संभालने के लिए मत भूलना।
pimlottc

13
ध्यान दें कि यह केवल डबल का पूर्णांक भाग लौटाता है, इसलिए 13.666667 या यहां तक ​​कि 13.9 के लिए, आपको 13 मिलेगा, 14. यदि आप निकटतम पूर्णांक नहीं चाहते हैं , तो मेरे उत्तर को देखें: stackoverflow.com/a/24816336-1450294
माइकल शेपर

2
यदि आप के कार्यान्वयन को देखो intValue(), यह सिर्फ doubleएक करने के लिए जाती है int
carlo.marinangeli

566

आपको इस तरह से विधि intValue () का उपयोग करके स्पष्ट रूप से अंतर मान प्राप्त करने की आवश्यकता है:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

या

double d = 5.25;
int i = (int) d;

67
धन्यवाद। बहुत साफ़। मेरे लिए स्वीकृत उत्तर, मूर्खतापूर्ण प्रश्न पूछने के लिए डांटने जैसा लगता है। लेकिन आपका जवाब बहुत उदार है।
बौद्ध एरियारत्ने

2
क्या होता है जब डबल मान पूर्णांक सीमा के बाहर होता है? (2 ^ 33 की तरह)
nikdeapen

5
कोई भी डबल वैल्यू> 2^31 - 1 (Integer.MAX_VALUE)ओवरफ्लो होगा।
अनुभा

3
और, वैसे, जब डबल से इंट में डाली जाती है, तो यह केवल पूर्णांक भाग को सकारात्मक और नकारात्मक दोनों संख्याओं के लिए रखता है, और गोलाई के बारे में परवाह नहीं करता है। जैसे 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
एरिक वांग

51

मुझे लगता है कि नुकसान के कवर और उसके पीछे के तर्क के बिना अन्य उत्तरों को समझना असंभव है।

आप सीधे Integerकिसी Doubleवस्तु को नहीं डाल सकते । भी Doubleऔर Integerअपरिवर्तनीय वस्तुएं हैं, इसलिए आप उन्हें किसी भी तरह से संशोधित नहीं कर सकते।

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

रणनीति:

एक को बदलने के Doubleलिए Integerआपको इस रणनीति का पालन करना होगा:

  1. Doubleवस्तु को आदिम में बदलें double। (= "अनबॉक्सिंग")
  2. आदिम doubleको आदिम में बदलें int। (= "कास्टिंग")
  3. आदिम को intवापस किसी Integerवस्तु में बदलना। (= "बॉक्सिंग")

कोड में:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

वास्तव में एक शॉर्टकट है। आप Doubleसीधे एक आदिम से सीधे अनबॉक्स कर सकते हैं int। इस तरह, आप चरण 2 को पूरी तरह से छोड़ सकते हैं।

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

नुकसान:

हालांकि, बहुत सारी चीजें हैं जो ऊपर दिए गए कोड में शामिल नहीं हैं। कोड-उपरोक्त शून्य-सुरक्षित नहीं है।

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

अब यह अधिकांश मूल्यों के लिए ठीक काम करता है। हालाँकि पूर्णांक में a की तुलना में बहुत छोटी श्रेणी (न्यूनतम / अधिकतम मान) होती है Double। उसके ऊपर, युगल "विशेष मान" भी धारण कर सकते हैं, जो पूर्णांक नहीं कर सकते हैं:

  • 1/0 = + अनंत
  • -1/0 = -इनफिनिटी
  • 0/0 = अपरिभाषित (NaN)

तो, अनुप्रयोग के आधार पर, आप बुरा अपवाद से बचने के लिए कुछ फ़िल्टरिंग जोड़ना चाह सकते हैं।

फिर, अगली कमी राउंडिंग रणनीति है। डिफ़ॉल्ट रूप से जावा हमेशा गोल होगा। राउंडिंग डाउन सभी प्रोग्रामिंग भाषाओं में सही समझ में आता है। मूल रूप से जावा बस कुछ बाइट्स फेंक रहा है। वित्तीय अनुप्रयोगों में आप निश्चित रूप से आधा-अप गोलाई (जैसे: round(0.5) = 1और round(0.4) = 0) का उपयोग करना चाहेंगे ।

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

ऑटो (अन) मुक्केबाजी

आपको इसमें ऑटो (संयुक्त राष्ट्र) मुक्केबाजी का उपयोग करने के लिए लुभाया जा सकता है , लेकिन मैं नहीं करूंगा। यदि आप पहले से ही फंस गए हैं, तो अगले उदाहरणों में यह स्पष्ट नहीं होगा। यदि आप ऑटो (इन) बॉक्सिंग के आंतरिक कामकाज को नहीं समझते हैं, तो कृपया इसका उपयोग न करें।

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

मुझे लगता है कि निम्नलिखित एक आश्चर्य नहीं होना चाहिए। लेकिन अगर यह है, तो आप जावा में कास्टिंग के बारे में कुछ लेख पढ़ना चाह सकते हैं।

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

मान को प्राथमिकता दें:

इसके अलावा, new Integer()कंस्ट्रक्टर (कुछ अन्य जवाबों के प्रस्ताव के रूप में) का उपयोग करने के लिए परीक्षा न करें । valueOf()क्योंकि वे कैशिंग का उपयोग तरीकों बेहतर हैं। इन तरीकों का उपयोग करना एक अच्छी आदत है, क्योंकि समय-समय पर वे आपको कुछ स्मृति बचाएंगे।

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

1
यह मेरी राय में सबसे अच्छा जवाब है
Thor

39

मुझे तीन संभावनाएं दिखती हैं। पहले दो अंकों को काट दिया जाता है, अंतिम एक निकटतम इंटेगर को गोल करता है।

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10

21
यदि आप एक प्राइमिटिव इंट में परिणाम स्टोर करने जा रहे हैं, तो Integer.valueOf की कोई आवश्यकता नहीं है। आपका कोड जावा को एक अनावश्यक बॉक्स और अनबॉक्स करने के लिए मजबूर करता है।
bvdb


23

वास्तव में, सबसे सरल तरीका उपयोग करना है intValue()। हालाँकि, यह केवल पूर्णांक भाग लौटाता है; यह कोई गोल नहीं करता है। यदि आप डबल मान के पूर्णांक को पास चाहते हैं , तो आपको यह करने की आवश्यकता होगी:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

और अशक्त मामले को मत भूलना:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() रिश्तेदार की कृपा से विषमता और NaN जैसे विषम बतख के मामलों को संभालता है।


2
यदि आपको int के परिणाम में Math.round कास्ट करना है तो आपको Integer.valueOf की आवश्यकता क्यों है?
एरन एच।

@EranH .: जावा 1.5 के रूप में, आप शायद नहीं करते हैं- ऑटोबॉक्सिंग का अर्थ है कि कोड की संभावना समाप्त हो जाती है। लेकिन मुझे लगता है कि यह कोड उन लोगों के लिए स्पष्ट है जो अभी तक वस्तुओं और आदिम नहीं हैं।
माइकल शेपर

किसने भी इस उत्तर को वोट दिया: यदि आप समझाते हैं कि आप समुदाय को बहुत अधिक मदद करेंगे, और यह आपको यह पता लगाने में भी मदद कर सकता है कि यह आपके लिए काम क्यों नहीं करता है। ओटीओएच के स्पष्टीकरण के बिना डाउन-वोटिंग, हर किसी के लिए अनैतिक है, और यह कायरता के रूप में सामने आता है।
माइकल शेपर

14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13

2
सवाल विशेष रूप से रैपर वर्गों के बारे में था। यह उत्तर आदिम के बारे में है।
माइकल शेपर


7
Double d = 100.00;
Integer i = d.intValue();

एक यह भी जोड़ना चाहिए कि यह ऑटोबॉक्सिंग के साथ काम करता है।

अन्यथा, आपको एक इंटिमेट (आदिम) मिलता है और फिर वहां से एक इंटेगर मिल सकता है:

Integer i = new Integer(d.intValue());

2
उपयोग न करें new Integer(int), इसके बजाय उपयोग करें Integer.valueOf(int), जिसमें छोटे पूर्णांकों के लिए कैश है, जैसे कि यह एक।
bvdb


4

आप "संकीर्ण या स्पष्ट प्रकार रूपांतरण" का उपयोग करके ऐसा कर सकते हैं, डबल → लंबा → इंट। मुझे उम्मीद है कि यह काम करेगा।

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: यह 0 देगा क्योंकि डबल में सभी दशमलव मान हैं और बाईं ओर कुछ भी नहीं है। 0.58 के मामले में, यह इसे 0. से कम कर देगा लेकिन दूसरों के लिए यह जादू करेगा।



3

डबल और इंटेगर क्रमशः जावा आदिम के लिए डबल और इंट के लिए आवरण वर्ग हैं। आप उन दोनों के बीच कास्ट कर सकते हैं, लेकिन आप फ्लोटिंग पॉइंट खो देंगे। अर्थात 5.4 को एक इंट में डाला जाएगा। 5. यदि आप इसे वापस लाते हैं, तो यह 5.0 होगा।


0

बस डबल के intValue विधि का उपयोग करें

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
दूसरे उत्तरों को दोहराने जैसा लगता है।
पंग

0

doubleNumber.intValue();विधि का प्रयोग करें ।


2
दूसरे उत्तरों को दोहराने जैसा लगता है।
पंग

-1

मेमोरी कुशल, क्योंकि यह डबल के पहले से बने इंस्टेंस को साझा करेगा।

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

क्या इसका कोई कारण है Math.floor(...)? intValue()हमेशा वैसे भी फर्श।
bvdb

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