2012-10-12 6 views
10

प्रभावी जावा से उद्धरित - यहोशू बलोचरिलेशनल ऑपरेटर किस तरह से तुलना करने का पालन नहीं करते हैं फ्लोटिंग पॉइंट मानों के साथ अनुबंध के लिए?

द्वारा द्वितीय संस्करण फ्लोटिंग प्वाइंट क्षेत्रों के लिए, संबंधपरक ऑपरेटर, जो के लिए सामान्य अनुबंध का पालन नहीं करते के स्थान पर Double.compare या Float.compare का उपयोग फ्लोटिंग पॉइंट मानों पर लागू होने पर की तुलना करें।

यह इस बात का विस्तार नहीं करता है कि यह क्यों है।

तो, मेरे सवाल यह है:

किस तरह से संबंधपरक ऑपरेटर जब चल बिन्दु मूल्यों के साथ प्रयोग किया compareTo के लिए सामान्य अनुबंध का पालन करने में विफल रहते हैं?

+2

संबंधित: http://stackoverflow.com/a/3668105/396458 – NullUserException

+0

ये क्लासेस NaN, (संख्या नहीं) मानों की अनुमति देते हैं। –

उत्तर

6

javadoc से:

public int compareTo(Double anotherDouble) 

दो डबल वस्तुओं संख्यानुसार तुलना करता है। इस विधि द्वारा किए गए तुलना में दो तरीकों से जावा भाषा संख्यात्मक तुलना ऑपरेटर (<, < =, ==,> =,>) द्वारा किए गए तुलनाओं से भिन्न होता है जब आदिम डबल मानों पर लागू होता है: Double.NaN द्वारा माना जाता है यह विधि स्वयं के बराबर और अन्य सभी डबल मानों (डबल। POSITIVE_INFINITY सहित) से अधिक होने के लिए। 0.0 डी इस विधि द्वारा -0.0 डी से अधिक होने के लिए माना जाता है। यह सुनिश्चित करता है कि इस विधि द्वारा लगाए गए डबल ऑब्जेक्ट्स का प्राकृतिक क्रम बराबर के साथ संगत है।

+0

अच्छे संदर्भ के लिए धन्यवाद :) –

3

जावा दस्तावेज़ Double#compareTo

से संख्यानुसार दो डबल वस्तुओं तुलना करता है। दो तरीकों से तुलना की इस विधि द्वारा किया जाता जावा भाषा संख्यात्मक तुलना ऑपरेटरों द्वारा किया उन लोगों से अलग कर रहे हैं (<, < =, ==,> =>) जब आदिम डबल मूल्यों के लिए लागू:

  • डबल विधि को इस विधि द्वारा स्वयं के बराबर और अन्य सभी डबल मानों (डबल। POSITIVE_INFINITY सहित) से अधिक माना जाता है।

  • 0.0 डी इस विधि द्वारा -0.0 डी से अधिक होने के लिए माना जाता है।

यह सुनिश्चित करता है कि Double.compareTo (वस्तु) (जो इस विधि को अपने व्यवहार को अग्रेषित करता है) Comparable.compareTo के लिए सामान्य अनुबंध का अनुसरण करता है, और डबल्स पर प्राकृतिक व्यवस्था बराबर एक-सा है।

double d1 =Double.NaN; 
    double d2 = Double.NaN; 

    System.out.println(Double.valueOf(d1).equals(d2)); ---> true 
    System.out.println(Double.valueOf(d1).compareTo(d2)); ---> 0 
    System.out.println(d1 == d2);       --->false 
+0

लेकिन, विशेष रूप से, यह संबंधपरक ऑपरेटरों के साथ _not_ संगत नहीं है। –

+0

@ लुइस वासरमैन हां। वह भी जोड़ा गया। –

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