2010-10-28 14 views
102

मेरे पास हाइबरनेट विधि है जो मुझे बिगडिसीमल देता है। मेरे पास एक और एपीआई विधि है जिसके लिए मुझे उस नंबर को पारित करने की आवश्यकता है लेकिन यह इंटीजर को पैरामीटर के रूप में स्वीकार करता है। मैं दोनों विधियों के रिटर्न प्रकार या परिवर्तनीय प्रकारों को नहीं बदल सकता।बिगडेसिमल को इंटीजर में कनवर्ट करना

अब BigDecimal को इंटीजर में कैसे परिवर्तित करें और इसे दूसरी विधि में कैसे पास करें?

क्या इसका कोई तरीका है?

+4

मैंने आपके शीर्षक को सही किया। यह * रूपांतरण है, * नहीं * कास्टिंग। * – EJP

उत्तर

162

आप myBigDecimal.intValueExact() (या केवल intValue()) पर कॉल करेंगे और यदि आप जानकारी खो देंगे तो यह अपवाद भी फेंक देगा। यह एक int देता है लेकिन autoboxing उस पर ख्याल रखता है।

+1

'intValueExact()' एक अच्छी सिफारिश है; इसे 1.5 – Anon

+0

में जोड़ा गया था 'intValue()' कॉलिंग खतरनाक है जब तक कि आप अपने जीवन पर 100% शर्त लगाते हैं कि यह संख्या 'इंटेगर' सीमा के भीतर है। – Snekse

+1

क्या यह समझ में आता है: "Integer.valueOf (myBigDecimal.intValueExact())"? – OddDev

29

क्या आप गारंटी दे सकते हैं कि BigDecimal में कभी भी Integer.MAX_VALUE से बड़ा मान नहीं होगा?

यदि हाँ, तो यहाँ अपने कोड intValue बुला है:

Integer.valueOf(bdValue.intValue()) 
+0

हां। मुझे लगता है कि इसमें Integer.MAX_VALUE – Vishal

+1

की तुलना में बड़ा मान नहीं होगा। मूल्य को करने का कोई कारण नहीं है ऑब्जेक्ट को प्राथमिक अधिकार के बजाय ऑब्जेक्ट प्राप्त करने के अलावा? – Basil

+0

मैं कहूंगा कि यह आधिकारिक उत्तर होना चाहिए क्योंकि ए। सीमा का उल्लेख है, बी। autoboxing रोकता है। – ledlogic

5

चाल करना चाहिए के बाद:

BigDecimal d = new BigDecimal(10); 
int i = d.intValue(); 
13

ठीक है, आप BigDecimal.intValue() कह सकते हैं:

इस बिगडिसिल को एक int में परिवर्तित करता है। यह रूपांतरण जावा भाषा विशिष्टता में परिभाषित के रूप में डबल से छोटा तक एक संकुचित आदिम रूपांतरण के समान है: इस बिगडिसिल के किसी भी आंशिक भाग को त्याग दिया जाएगा, और यदि परिणामी "बिगइंटर" एक int में फ़िट होने के लिए बहुत बड़ा है, केवल कम -ऑर्डर 32 बिट्स लौटाए जाते हैं। ध्यान दें कि यह रूपांतरण इस बिगडिमेमल मान की समग्र परिमाण और परिशुद्धता के बारे में जानकारी खो सकता है और परिणामस्वरूप विपरीत संकेत के साथ परिणाम लौटा सकता है।

फिर आप या तो स्पष्ट रूप Integer.valueOf(int) आपको कॉल या जावा की एक पर्याप्त नवीनतम संस्करण का उपयोग कर रहे हैं तो स्वत: मुक्केबाजी यह तुम्हारे लिए क्या कर सकते हैं।

14

टी एल; डॉ

उपयोग सार्वभौमिक रूपांतरण के लिए इनमें से किसी एक

//Java 7 or below 
bigDecimal.setScale(0, RoundingMode.DOWN).intValueExact() 
//Java 8  
bigDecimal.toBigInteger().intValueExact() 

तर्क

जवाब क्या आवश्यकताएँ हैं पर निर्भर करता है और कैसे आप ये सवाल का जवाब की जरूरत है।

  • क्या BigDecimal संभावित रूप से एक गैर-शून्य अंशकालिक भाग होगा?
  • BigDecimal संभावित रूप से Integer रेंज में फिट नहीं होगा?
  • क्या आप गैर-शून्य fractional भागों गोलाकार या छिड़काव करना चाहते हैं?
  • आप कैसे गैर-शून्य fractional भागों गोलाकार पसंद करेंगे?

यदि आपने पहले 2 प्रश्नों के उत्तर दिए हैं, तो आप केवल BigDecimal.intValueExact() का उपयोग कर सकते हैं क्योंकि अन्य ने सुझाव दिया है और कुछ अप्रत्याशित होने पर इसे उड़ा दें।

यदि आप प्रश्न संख्या 2 के बारे में बिल्कुल 100% आत्मविश्वास नहीं रखते हैं, तो intValue()हमेशा गलत उत्तर है।

बेहतर

के अन्य उत्तर के आधार पर निम्न मान्यताओं का उपयोग करते हैं बनाना।

  • हम परिशुद्धता खोने और मूल्य छोटा क्योंकि जो intValueExact() और ऑटो बॉक्सिंग कर
  • हम एक अपवाद फेंका चाहते हैं जब BigDecimalInteger सीमा से बड़ा है क्योंकि कुछ और जब तक आप पागल हो जाएगा है कि के साथ ठीक हैं जब आप हाई ऑर्डर बिट्स छोड़ते हैं तो आसपास के लपेटने के लिए एक बहुत ही विशिष्ट आवश्यकता होती है।

उन पैराम को देखते हुए, intValueExact() अपवाद फेंकता है जब हम नहीं चाहते हैं कि हमारा अंश भाग गैर-शून्य हो। दूसरी ओर, intValue() अपवाद नहीं फेंकता है जब यह होना चाहिए कि हमारे BigDecimal बहुत बड़े हैं।

दोनों दुनिया के सर्वश्रेष्ठ प्राप्त करने के लिए, पहले BigDecimal को बंद करें, फिर कनवर्ट करें। राउंडिंग प्रक्रिया पर आपको अधिक नियंत्रण देने का भी लाभ है।

स्पॉक ग्रूवी टेस्ट

void 'test BigDecimal rounding'() { 
    given: 
    BigDecimal decimal = new BigDecimal(Integer.MAX_VALUE - 1.99) 
    BigDecimal hugeDecimal = new BigDecimal(Integer.MAX_VALUE + 1.99) 
    BigDecimal reallyHuge = new BigDecimal("10000000000000000000000000000000000000000000000") 
    String decimalAsBigIntString = decimal.toBigInteger().toString() 
    String hugeDecimalAsBigIntString = hugeDecimal.toBigInteger().toString() 
    String reallyHugeAsBigIntString = reallyHuge.toBigInteger().toString() 

    expect: 'decimals that can be truncated within Integer range to do so without exception' 
    //GOOD: Truncates without exception 
    '' + decimal.intValue() == decimalAsBigIntString 
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information 
    // decimal.intValueExact() == decimalAsBigIntString 
    //GOOD: Truncates without exception 
    '' + decimal.setScale(0, RoundingMode.DOWN).intValueExact() == decimalAsBigIntString 

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception' 
    //BAD: hugeDecimal.intValue() is -2147483648 instead of 2147483648 
    //'' + hugeDecimal.intValue() == hugeDecimalAsBigIntString 
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information 
    //'' + hugeDecimal.intValueExact() == hugeDecimalAsBigIntString 
    //GOOD: Throws conversionOverflow ArithmeticException because to large 
    //'' + hugeDecimal.setScale(0, RoundingMode.DOWN).intValueExact() == hugeDecimalAsBigIntString 

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception' 
    //BAD: hugeDecimal.intValue() is 0 
    //'' + reallyHuge.intValue() == reallyHugeAsBigIntString 
    //GOOD: Throws conversionOverflow ArithmeticException because to large 
    //'' + reallyHuge.intValueExact() == reallyHugeAsBigIntString 
    //GOOD: Throws conversionOverflow ArithmeticException because to large 
    //'' + reallyHuge.setScale(0, RoundingMode.DOWN).intValueExact() == reallyHugeAsBigIntString 

    and: 'if using Java 8, BigInteger has intValueExact() just like BigDecimal' 
    //decimal.toBigInteger().intValueExact() == decimal.setScale(0, RoundingMode.DOWN).intValueExact() 
} 
-2

मैंने पाया कि ऊपर मेरे लिए काम नहीं किया। मैं एक JTable से एक सेल मूल्य खींच रहा था लेकिन दोगुना या int आदि मेरे समाधान के लिए डाली नहीं कर सकता:

Object obj = getTable().getValueAt(row, 0); 

जहां पंक्ति 0 हमेशा एक नंबर होगा। उम्मीद है कि यह किसी को भी स्क्रॉल करने में मदद करता है!

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