इंटीग्रेट करने के लिए BigDecimal परिवर्तित


134

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

अब कैसे पूर्णांक में BigDecimal बदलने और यह दूसरी विधि को पारित करने के लिए?

इस से बाहर एक तरीका है?


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

जवाबों:


209

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


1
intValueExact()एक अच्छी सिफारिश है; यह 1.5 में जोड़ा गया है
Anon

कॉलिंग intValue()तब तक खतरनाक है जब तक कि आप 100% अपने जीवन को इस पर सकारात्मक रूप से दांव पर न लगा लें कि संख्या Integerसीमा के भीतर है ।
स्नेक

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

32

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

यदि हाँ, तो यहां आपका कोड कॉलिंग है intValue:

Integer.valueOf(bdValue.intValue())

हाँ। मुझे लगता है कि यह
विशाल

2
वहाँ एक आदिम अधिकार के बजाय एक वस्तु पाने के अलावा अन्य करने के लिए कोई कारण नहीं है?
तुलसी

मैं कहूंगा कि यह आधिकारिक जवाब होना चाहिए क्योंकि ए। सीमा का उल्लेख, बी। ऑटोबॉक्सिंग को रोकता है।
नेतृत्व किया

22

टी एल; डॉ

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

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

विचार

उत्तर इस बात पर निर्भर करता है कि आवश्यकताएँ क्या हैं और आप इन प्रश्नों का उत्तर कैसे देते हैं।

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

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

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

इसे बेहतर बना रहे हैं

आइए अन्य उत्तरों के आधार पर निम्नलिखित मान्यताओं का उपयोग करें।

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

उन परिंदों को देखते हुए, 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()
}

18

खैर, आप कॉल कर सकते हैं BigDecimal.intValue():

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

Integer.valueOf(int)यदि आप जावा के पर्याप्त हाल के संस्करण का उपयोग कर रहे हैं तो आप या तो स्पष्ट रूप से कॉल कर सकते हैं या ऑटो-बॉक्सिंग कर सकते हैं।





-4

मैंने पाया कि ऊपर वाले ने मेरे लिए काम नहीं किया। मैं एक JTable से सेल वैल्यू खींच रहा था, लेकिन डबल या इंट आदि कास्ट नहीं कर सका। मेरा हल:

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

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

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