BigDecimal बराबर () बनाम तुलना ()


157

साधारण परीक्षण वर्ग पर विचार करें:

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

}

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

false
true

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

पुनश्च: मैं देख रहा हूं कि बिगडेसिमल में एक inflate()विधि equals()विधि है। inflate()वास्तव में क्या करता है?


1
विज्ञापन inflate(): यह सार्वजनिक एपीआई का हिस्सा नहीं है क्योंकि यह केवल आंतरिक प्रतिनिधित्व में हेरफेर करता है और "बाहर" के लिए कोई दृश्य प्रभाव नहीं है। इसलिए जब तक आप वास्तव में BigDecimalइन-डेप्थ के कार्यान्वयन का अध्ययन नहीं करना चाहते हैं , मेरा सुझाव है कि आप इस पद्धति को अनदेखा करें।
जोकिम सॉर

एक संक्षिप्त विवरण और स्रोत कोड स्निपेट यहां
देखे

जवाबों:


224

इसका उत्तर विधि के JavaDoc में हैequals() :

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

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

के रूप में क्यों equals() इस तरह से व्यवहार करती है, यह उत्तर दिया गया है यह तो सवाल में


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

3
मानक एपीआई के कई हिस्से "अनजाने में" कार्य करने के लिए होते हैं, जब सहज बात सही नहीं होगी। BigDecimalएक ऐसी बात है। इसलिए किसी को हमेशा JavaDoc की जांच करनी चाहिए। कम से कम एक बार आपका पता कुछ अजीब चल रहा है।
जोकिम सउर

7
मजेदार। आपके उत्तर को पढ़ने के बाद मैंने बस तुलनात्मक जाँच की और यह कहा कि
समतुल्यता के

4
मैंने पूछा है कि क्यों: stackoverflow.com/questions/14102083/…
bacar

8
@StephenC मुझे लगता है कि यह गलत है कि यह असंगति मौजूद है।
मैट आर

1

मैं देख रहा हूं कि बिगडेसिमल में इनफ्लो () पद्धति पर एक फुलाव () विधि है। वास्तव में क्या फुलाया जाता है?

मूल रूप से, यदि आवश्यक हो, तो inflate()कॉल करता BigInteger.valueOf(intCompact)है, अर्थात यह एक के रूप में संग्रहित अनकल्ड वैल्यू बनाता BigIntegerहै long intCompact। यदि आपको इसकी आवश्यकता नहीं है BigIntegerऔर long BigDecimalजब तक संभव न हो, अंतरिक्ष को बचाने की कोशिश करने के लिए बिना मूल्य वाला मूल्य उचित लगता है।


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

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

1

मेरा मानना ​​है कि दो नंबरों (बिगडेसिमल) को बनाने के लिए सही उत्तर होगा, एक ही पैमाना है, तो हम उनकी समानता के बारे में फैसला कर सकते हैं। उदाहरण के लिए, क्या ये दो संख्याएँ समान हैं?

1.00001 and 1.00002

खैर, यह पैमाने पर निर्भर करता है। स्केल 5 (5 दशमलव अंक) पर, नहीं वे समान नहीं हैं। लेकिन छोटे दशमलव पूर्वताओं (स्केल 4 और निचले) पर उन्हें समान माना जाता है। इसलिए मेरा सुझाव है कि दो संख्याओं के पैमाने को समान बनाएं और फिर उनकी तुलना करें।


-10

आप दोहरे मूल्य के साथ भी तुलना कर सकते हैं

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

5
कृपया इस घोल से जितना हो सके बचें। यहां तक ​​कि युगल की तुलना "एप्सिलॉन" से की जानी चाहिए। बिगडेसिमल होने और डबल्स के रूप में तुलना करने का कोई मतलब नहीं है। बहुत अधिक संभावना है कि आप अपने खुद के पैर को गोली मार लेंगे।
वादिम किरिलचुक

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