2009-11-22 17 views
8
>>> float(str(0.65000000000000002)) 

0.65000000000000002 

>>> float(str(0.47000000000000003)) 

0.46999999999999997  ??? 

यहां क्या हो रहा है? मैं स्ट्रिंग के लिए 0.47000000000000003 कैसे परिवर्तित करूं और परिणामस्वरूप मूल्य वापस फ्लोट करने के लिए कैसे परिवर्तित करूं?पायथन फ्लोट - स्ट्र - फ्लोट अजीबता

मैं विंडोज पर पायथन 2.5.4 का उपयोग कर रहा हूं।

+1

द्वारा इस समस्या को हल जोड़ा IEEE-754 टैग –

+3

आर सी: मुझे लगता है कि बहुत से लोग (हाँ, प्रोग्रामर भी) यह नहीं जानते कि आईईईई 754 फ्लोटिंग पॉइंट नंबर परिभाषित करता है (हर कोई भाषा विनिर्देशों को नहीं पढ़ता है :-))। तो मैं वास्तव में सोचता हूं कि "फ़्लोटिंग-पॉइंट" टैग एक बेहतर विकल्प होगा जब तक कि मानक के बारे में विशिष्ट प्रश्न न हों। – Joey

+5

निश्चित रूप से जो लोग इस तरह के प्रश्न पूछते हैं उन्हें नहीं पता कि आईसीआई -754 क्या है ... – sth

उत्तर

16

str(0.47000000000000003)'0.47' और float('0.47')0.46999999999999997 हो सकता है। float(repr(0.47000000000000003)) या eval(repr(0.47000000000000003)) आप अपेक्षित परिणाम दे देंगे, लेकिन आप Decimal का उपयोग करना चाहिए अगर आप परिशुद्धता की आवश्यकता है: यह प्रतिनिधित्व कर रहे हैं जिस तरह से चल बिन्दु संख्या (इस wikipedia लेख देखें)

नोट के कारण है।

+0

धन्यवाद, जानना अच्छा है! – Sharun

+0

नोट: न केवल परिशुद्धता के लिए बल्कि सटीकता के लिए भी दशमलव का उपयोग करें। – Joey

+0

मुझे यकीन नहीं है, लेकिन मैं समानार्थी के रूप में "परिशुद्धता" और "सटीकता" को समझता हूं, सटीक सामान्य शब्द होता है। – tzot

3

फ्लोट (और डबल) में अनंत परिशुद्धता नहीं है। स्वाभाविक रूप से, गोलियां त्रुटियां तब होती हैं जब आप उन पर काम करते हैं।

2

यह एक Python FAQ

एक ही सवाल को quite regularly in comp.lang.python भी आता है।

मुझे लगता है कि यह एक एफएक्यू है क्योंकि यह कि अन्य सभी मामलों में पाइथन सही है ;-), हम उम्मीद करते हैं कि यह अंकगणित पूरी तरह से निष्पादित करे - जैसा कि हमें स्कूल में सिखाया गया था। हालांकि, जैसा कि कोई भी संख्यात्मक तरीके से किया गया है, वह आपको बताएगा, फ्लोटिंग पॉइंट नंबर सही से बहुत लंबा रास्ता है।

Decimal एक अच्छा विकल्प है और यदि आप अधिक गति और अधिक विकल्प चाहते हैं gmpy भी बहुत अच्छा है।

0

इस उदाहरण से मुझे लगता है कि इस अजगर में कोई त्रुटि है जब आप आसान तरीका विभाजित

>>> print(int(((48/5.0)-9)*5)) 
    2 

, मैं इस

>>> print(int(round(((48/5.0)-9)*5,2))) 
    3 
संबंधित मुद्दे