2012-04-03 25 views
32

कुछ दिलचस्प टिप्पणियों w.r.t 0 पर ऑपरेटर के बराबर होती है और 0,0, जावा

  1. new Double(0.0).equals(0) रिटर्न झूठी में शून्य के लिए ऑपरेटर (BigDecimal/डबल) के बराबर है, जबकि new Double(0.0).equals(0.0) रिटर्न सच।

  2. BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0)) झूठा रिटर्न देता है, जबकि BigDecimal.ZERO.equals(BigDecimal.valueOf(0)) सत्य देता है।

ऐसा लगता है कि दोनों मामलों में स्ट्रिंग तुलना की जा रही है। क्या कोई इस पर कुछ प्रकाश डाल सकता है।

धन्यवाद।

उत्तर

59

बिगडेसिमल 'बराबर' मूल्य और पैमाने की तुलना करता है। आप compareTo का उपयोग करना चाहिए आप केवल मूल्यों (0 == 0.0) की तुलना करना चाहते हैं:

BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true 
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true 

javadoc देखें।

अन्य उत्तरों द्वारा समझाया गया डबल तुलना के लिए, आप new Double(0.0).equals(0) में एक इंटीजर के साथ एक डबल की तुलना कर रहे हैं, जो false देता है क्योंकि ऑब्जेक्ट्स के अलग-अलग प्रकार होते हैं। संदर्भ के लिए, code for the equals method in JDK 7 है:

public boolean equals(Object obj) { 
    return (obj instanceof Double) 
      && (doubleToLongBits(((Double)obj).value) == 
        doubleToLongBits(value)); 
} 

आपके मामले में, (obj instanceof Double) गलत है।

1
new Double(0.0).equals(0); //false 

जैसा कि आपने पारित तर्क पूर्णांक है। और equels()में डबल वर्ग जाँच करता है कि तर्क आयुध डिपो उदाहरण डबल या नहीं ऑपरेटर की उदाहरण का उपयोग कर रहा है।

डबलबराबर() विधि।

if (!(argument instanceof Double)) 
    return false; 

तर्क आप पारित कर दिया पूर्णांक, जो डबल का उदाहरण नहीं है, तो यह गलत देता है।

5
  1. अपनी पहली अभिव्यक्ति में 0 एक int है, जो एक Integer में autoboxed किया जा सकता है, लेकिन एक Double के लिए नहीं के रूप में व्याख्या की है। तो दोनों का प्रकार अलग है, इसलिए वे बराबर नहीं हैं। ओटीओएच 0.0 एक double है, जो Double में ऑटोबॉक्साइड है, इसलिए दो ऑपरेंड बराबर समझा जाता है।

  2. बिगडेसिमल में एक स्केल भी होता है (यानी दशमलव विभाजक बिंदु के दाईं ओर अंकों की संख्या)। BigDecimal.ZERO में "0" का मान है, इसलिए इसका स्तर 0 है। इसलिए यह "0.0" के बराबर नहीं है, जिसका स्केल 1 है।
    आप मूल्यों की तुलना करना चाहते हैं, BigDecimal.compareTo का उपयोग करें:

    new Double(0.0).equals(Integer.valueOf(0)) 
    

    Double.equals:

    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 
    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 
    
0

नई डबल (0.0) .equals (0) वास्तव में कुछ इस तरह के रूप में बॉक्सिंग है (...) एक और डबल उदाहरण दिए जाने तक कभी भी सच नहीं होगा।

+0

@ लुकासएडर धन्यवाद, अपडेट किया गया। – Adam

0
new Double(0.0).equals(0) 

इस लाइन (जो शून्य सटीक नहीं है) 0.

BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0)) 

के पूर्णांक के साथ 0 से डबल मूल्य की तुलना BigDecimal बराबरी ऑपरेशन में पैमाने लंबाई की तुलना करेंगे।

0

प्रदर्शन विचार के लिए BigDecimal, BigInteger छोटे मान 0 से 15 BigDecimal के मामले में कैश (अंशों के बिना)

BigDecimal.ZERO नई BigDecimal हो जाएगा (BigInteger.ZERO, 0, 0, 1) & valueOf विधि आमतौर पर 0 से 15 के लिए कैश से उठाती है :)

0
please try doublevalue instead of compareto if you feel is not as beautiful and readable as or simply need an alternative like below: 

BigDecimal a = new BigDecimal("0.00"); 
BigDecimal b = new BigDecimal("0.0"); 
BigDecimal c = new BigDecimal("0"); 

if(a.doubleValue()==BigDecimal.ZERO.doubleValue()) { 
System.out.println("a equals"); 
} 

if(b.doubleValue()==BigDecimal.ZERO.doubleValue()) { 
System.out.println("b equals"); 
} 

if(c.doubleValue()==BigDecimal.ZERO.doubleValue()) { 
System.out.println("c equals"); 
} 
+1

एक बिगडेसिमल को दोहरे में बदलने के परिणामस्वरूप परिशुद्धता और गैर-शून्य का नुकसान हो सकता है लेकिन शून्य के करीब बिगडेसिमल डबल हो गया है। 0 आपको BigDecimal में 'comparTo' विधि' का उपयोग करके तुलना करना चाहिए –