2011-07-22 15 views
112

पर विचार साधारण परीक्षण वर्ग:BigDecimal के बराबर होती है() compareTo() बनाम

import java.math.BigDecimal; 

/** 
* @author The Elite Gentleman 
* 
*/ 
public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     BigDecimal x = new BigDecimal("1"); 
     BigDecimal y = new BigDecimal("1.00"); 
     System.out.println(x.equals(y)); 
     System.out.println(x.compareTo(y) == 0 ? "true": "false"); 
    } 

} 

आप (होशपूर्वक) कह सकते हैं कि xy के बराबर है (संदर्भ आपत्ति नहीं है), लेकिन जब आप प्रोग्राम चलाने निम्न परिणाम दिखाता है:

false 
true 

प्रश्न: BigDecimal में compareTo() और equals() के बीच अंतर यह है कि compareTo निर्धारित कर सकते हैं कि x equa है एल y?

पीएस: मुझे लगता है कि BigDecimal विधि पर inflate() विधि है। inflate() वास्तव में क्या करता है?

+0

विज्ञापन तुलना कर सकते हैं 'बढ़()': यह सार्वजनिक एपीआई का हिस्सा नहीं है क्योंकि यह केवल आंतरिक प्रतिनिधित्व manipulates और "बाहर" के लिए नहीं दिखाई प्रभाव पड़ता है। इसलिए जब तक कि आप वास्तव में 'BigDecimal' के गहराई से कार्यान्वयन का अध्ययन नहीं करना चाहते हैं, तो मैं सुझाव दूंगा कि आप इस विधि को अनदेखा करें। –

+0

एक संक्षिप्त स्पष्टीकरण और स्रोत कोड स्निपेट्स यहां पाए जा सकते हैं [http://stackoverflow.com/a/39163942/4723795) – xenteros

उत्तर

157

जवाब the JavaDoc of the equals() method में है:

compareTo के विपरीत, इस विधि मानता है दो BigDecimal वस्तुओं के बराबर ही अगर वे मूल्य और बड़े पैमाने में बराबर हैं (इस प्रकार 2.0 नहीं 2.00 के बराबर जब इस विधि द्वारा की तुलना में है)।

दूसरे शब्दों में: equals() जांच करता है कि BigDecimal वस्तुओं रहे हैं बिल्कुलमें एक ही हर पहलू। compareTo() "केवल" उनके संख्यात्मक मूल्य की तुलना करता है।

+13

यदि आप JavaDoc को ध्यान से नहीं पढ़ते हैं तो यह 'BigDecimal' का एक बहुत ही मुश्किल हिस्सा है। :) - हमें इस बात से कुछ अजीब कीड़े मिल गईं जब तक हम अंतर को महसूस नहीं करते। – Thomas

+3

मानक एपीआई के कई हिस्सों को "अनजाने में" कार्य करना होता है, जब सहज ज्ञान सही नहीं होगा। 'बिगडिसिल' एक ऐसी चीज है। इसलिए किसी को हमेशा जावाडॉक की जांच करनी चाहिए। * कम से कम * एक बार जब आप कुछ अजीब पता लगा रहे हैं। –

+6

मजेदार। अपना उत्तर पढ़ने के बाद मैंने तुलनात्मक रूप से जांच की और यह कहता है कि बराबर के साथ स्थिरता "दृढ़ता से अनुशंसित है (लेकिन आवश्यक नहीं)" – SJuan76

1

मुझे लगता है कि BigDecimal के बराबर() विधि पर एक inflate() विधि है। वास्तव में क्या करता है() वास्तव में करते हैं?

असल में, inflate() कॉल BigInteger.valueOf(intCompact) यदि आवश्यक हो, अर्थात यह बगैर माप का मूल्य है कि एक BigIntegerlong intCompact से के रूप में संग्रहीत किया जाता है बनाता है। यदि आपको BigInteger की आवश्यकता नहीं है और unscaled मान longBigDecimal में फिट बैठता है, तो यथासंभव लंबे समय तक स्थान बचाने की कोशिश करता है।

+0

मुझे नहीं पता कि आपने क्या लिखा है (विशेष रूप से अंतिम वाक्य के साथ)। –

+0

@ द एलिट जेंटलमेंट आखिरी वाक्य में केवल यह कहना चाहिए कि आंतरिक रूप से 'बिगडिसीमल' अपने लापरवाह मूल्य को 'लम्बे' के साथ-साथ 'बिगइंटर' में रखता है। यदि 'BigInteger' को आंतरिक रूप से जरूरी नहीं है, तो यह नहीं बनाया गया है, लेकिन यदि इसकी आवश्यकता है (उदाहरण के लिए जब' बराबर 'मुठभेड़ों का सामना करना पड़ता है और एक गैर-फुर्ती' बिगडिसीमल) 'inflate() 'इसे बनाने के लिए उपयोग किया जाता है। - इसे समेटने के लिए: यदि आवश्यक हो तो 'inflate()' आंतरिक रूपांतरणों को संभालता है और चूंकि यह निजी है, इसलिए कक्षा के उपयोगकर्ताओं के लिए कोई फर्क नहीं पड़ता। – Thomas

-3

तुम भी डबल मूल्य के साथ

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1"); 
System.out.println(a.doubleValue()==b.doubleValue()); 
+3

यह संख्या तब तक काम नहीं करेगी जब संख्या काफी बड़ी हो। – xenteros

+2

कृपया जितना संभव हो सके इस समाधान से बचें। यहां तक ​​कि युगल की तुलना "ईपीएसलॉन" से की जानी चाहिए। BigDecimal होने और इसे युगल के रूप में तुलना करने की कोई समझ नहीं है .. बहुत अधिक संभावना है कि आप अपना पैर शूट करेंगे। –

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