2010-03-11 15 views
5

यह किसी भी तरह मेरे सवाल से संबंधित है Why is ''>0 True in Python?पाइथन में दशमलव ('0')> 99 99.0 सच क्यों है?

अजगर 2.6.4 में:

>> Decimal('0') > 9999.0 
True 

अपने मूल प्रश्न के answer मैं समझता हूँ से जब अजगर में विभिन्न प्रकार की वस्तुओं की तुलना प्रकार 2.x कि उनके नाम से आदेश दिया जाता है। लेकिन इस मामले में:

>> type(Decimal('0')).__name__ > type(9999.0).__name__ 
False 

Decimal('0') > 9999.0 == True क्यों है?

अद्यतन: मैं आमतौर पर उबंटू (लिनक्स 2.6.31-20-जेनेरिक # 57-उबंटू एसएमपी सोम 8 फरवरी 09:05:19 यूटीसी 2010 i686 जीएनयू/लिनक्स, पायथन 2.6.4 (आर 264: 75706, दिसंबर) पर काम करता हूं 7 200 9, 18:45:15) [जीसीसी 4.4.1] linux2 पर)। विंडोज़ पर (विनएक्सपी प्रोफेशनल एसपी 3, पायथन 2.6.4 (आर 264: 75706, 3 नवंबर 200 9, 13:23:17) [एमएससी v.1500 32 बिट (इंटेल)] Win32 पर) मेरा मूल विवरण अलग-अलग काम करता है:

>> Decimal('0') > 9999.0 
False 

मैं अब और भी परेशान हूं। % - (

+0

मुझे आपके पहले वक्तव्य के लिए एक ही परिणाम नहीं मिलते हैं। मेरा पर यह झूठी के रूप में आता है। हालांकि मुझे आपके दूसरे कथन के लिए एक ही परिणाम मिलता है। मैं पायथन 2.6.4 का भी उपयोग कर रहा हूं। –

+0

@ जस्टिन जो मुझे ट्रिपल चेक के रूप में और भी परेशान करता है और यह पाइथन 3.1.1 का उपयोग करके 'ट्रू' – parxier

+0

लौटाता है, पहला कथन देता है (दशमलव आयात करने के बाद): 'TypeError: unorderable प्रकार: दशमलव()> float() ' –

उत्तर

12

क्योंकि दशमलव मॉड्यूल लंबे, int, और दशमलव को छोड़कर किसी भी प्रकार के विरुद्ध तुलना नहीं करता है। अन्य सभी मामलों में, दशमलव चुपचाप "वस्तु के बारे में कुछ नहीं जानता" जितना अधिक होता है। आप यह व्यवहार देख सकते हैं । decimal.py

बेवकूफ, मूर्ख दशमलव वर्ग के _convert_other() फ़ंक्शन

ओह में, http://bugs.python.org/issue2531 रूप में अच्छी तरह देख

तो, यहाँ क्या होता है:।

  • दुभाषिया Decimal.__gt__ तुलना फ़ंक्शन को कॉल करता है।
  • Decimal.__gt__Decimal._convert_other पर आने वाली फ्लोट को दशमलव के रूप में परिवर्तित करने के लिए कॉल करता है।
  • Decimal._convert_other फ्लोट्स को समझ में नहीं आता है। Decimal._convert_other में कार्यान्वयन नीचे long, int, और Decimal ऑपरेंड के प्रकारों के लिए स्पष्ट रूप से जांचता है। हां, यह एक बग है, उस अप्रत्याशित लाइब्रेरी कार्यान्वयन में बग आगे लाइन के नीचे कारण बनता है। यह सही चीज़ करने के लिए क्लीनर होगा या यहां तक ​​कि केवल TypeException के माध्यम से। इसके बजाय यह उसी NotImplemented के माध्यम से होता है जो कि कर्मचारी रिकॉर्ड के हैश का कहना है कि एक दशमलव की तुलना करना होगा।
  • कुछ अन्य तुलना संचालन की कोशिश की जाती है। तुलना छोड़ देता है।
  • डिफ़ॉल्ट तुलना, सीपीथॉन ऑब्जेक्ट्स/object.c/default_3way_compare में नीचे दी गई कॉल।
  • पायथन 3 में, यह सही बार्फ़। पायथन 2 में, यह आईडी() फ़ंक्शंस की तुलना करता है।
  • विंडोज़ पर, एक केस असंवेदनशील तुलना का उपयोग किया जाता है (प्रकार)। आधुनिक प्रणालियों पर, केस संवेदनशील तुलना का उपयोग किया जाता है।
  • तो आपको अलग-अलग परिणाम मिलते हैं।

क्या हम अभी तक वहां हैं?

+0

टीएक्स मुझे सही स्थापित करने के लिए, इसलिए मैंने अपना (भ्रामक) उत्तर हटा दिया और कृतज्ञता में आपका +1 किया ;-)। –

+0

@charles: फिर यह विभिन्न प्लेटफ़ॉर्म पर अलग-अलग क्यों काम करता है? – parxier

+0

कोई सुराग नहीं। मेरे पास विंडोज नहीं है। दोनों पर _convert_other() को खींचने और उनकी तुलना करने का प्रयास करें। –

1
def __gt__(self, other, context=None): 
    other = _convert_other(other) 
    if other is NotImplemented: 
     return other 
    ans = self._compare_check_nans(other, context) 
    if ans: 
     return False 
    return self._cmp(other) > 0 


def _convert_other(other, raiseit=False): 
    """Convert other to Decimal. 

    Verifies that it's ok to use in an implicit construction. 
    """ 
    if isinstance(other, Decimal): 
     return other 
    if isinstance(other, (int, long)): 
     return Decimal(other) 
    if raiseit: 
     raise TypeError("Unable to convert %s to Decimal" % other) 
    return NotImplemented 
संबंधित मुद्दे