2016-10-01 11 views
13

पायथन 2.7 और 3.x में, 0 < x < 1 द्वारा विभाजित करते समय पूर्णांक विभाजन मुझे एक गैर-सही संख्या क्यों देता है?1 // 0.1 == 9.0 क्यों है?

ऋणात्मक संख्याओं को -1 < x < 0 भी सही ढंग से काम:

>>> 1//.1 
9.0 
>>> 1//-.1 
-10.0 

मैं एक नकारात्मक (या सकारात्मक) संख्या ऋणात्मक अनंत की ओर दौर के साथ कि पूर्णांक विभाजन को समझते हैं, लेकिन मैं सोचा होगा 1//.110.0 में परिणाम चाहिए, क्योंकि 1 हो सकता है शेष के बिना .1 द्वारा विभाजित।

+4

फ़्लोर डिवीजन। इस पोस्ट को देखें: http://stackoverflow.com/questions/5535206/negative-integer-division-surprising-result – Manhattan

+3

मंजिल (1/.1) 10 के बराबर होना चाहिए हालांकि –

+6

संभवतः एक अन्य आर्टिफैक्ट [क्या फ़्लोटिंग पॉइंट गणित टूटा हुआ है ?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

उत्तर

26

जो आप यहां देख रहे हैं वह अनिवार्य रूप से / और // के साथ फर्श विभाजन के बीच अंतर का प्रभाव है।

ध्यान में रखना हमेशा भी महत्वपूर्ण है general issue with floating point arithmetic जो कि वे कैसे काम करते हैं, यह निश्चित रूप से एक निश्चित अव्यवस्था है। उन परिस्थितियों में, वास्तव में क्या चल रहा है यह जांचने के लिए decimal मॉड्यूल का उपयोग करना हमेशा अच्छा होता है। तो चलो देखते हैं आप यहाँ क्या कर रहे:

सबसे पहले, .1 पहले से ही सटीक नहीं है:

>>> Decimal(1)/Decimal(.1) 
Decimal('9.999999999999999444888487687') 
>>> 1/.1 
10.0 

:

>>> Decimal(.1) 
Decimal('0.1000000000000000055511151231257827021181583404541015625') 

तो, के विभाजन के वास्तविक परिणाम को देखो जैसा कि आप देख सकते हैं, / का उपयोग कर सामान्य विभाजन आपको 10 को फ़्लोटिंग पॉइंट अंकगणित के साथ बिल्कुल नहीं देता है। लेकिन यह वास्तव में करीब है। यही कारण है कि, जब आप सामान्य फ्लोट का उपयोग करते हैं, तो आप वास्तव में वापस 10 प्राप्त करते हैं (चूंकि डिवीजन अपर्याप्तता संख्या प्रकार की अपर्याप्तता में तुरंत खो जाती है)।

फर्श विभाजन का उपयोग करते समय, परिणाम से पहले अस्पष्टता में सुधार किया जाए फिदा है, ताकि आप 9 क्यों प्राप्त होते हैं:

>>> Decimal(1) // Decimal(.1) 
Decimal('9') 
>>> 1/.1 
10.0 
ऋणात्मक संख्याओं के साथ

, फर्श प्रभाव विपरीत दिशा है, के रूप में समझाया in that other question :

>>> Decimal(1)/Decimal(-.1) 
Decimal('-9.999999999999999444888487687') 
>>> 1/-.1 
-10.0 
>>> Decimal(1) // Decimal(-.1) 
Decimal('-9') 
>>> 1 // -.1 
-10.0 
+3

एक और अच्छा उदाहरण '3 // -.3' है, जहां यह नकारात्मक नंबर के साथ" ** विफल रहता है ", जिसके परिणामस्वरूप' -11.0' होता है। –

+0

नोट: 'दशमलव (" 1 ") // दशमलव (" 0.1 ") 'दशमलव' (" 10 ") देता है क्योंकि यह दशमलव संख्याओं का बिल्कुल प्रतिनिधित्व कर सकता है। दशमलव निश्चित रूप से दिए गए नंबरों को सुरक्षित रखता है, इसलिए दशमलव इनपुट को स्ट्रिंग देना मानव इनपुट के लिए अधिक सटीक हो सकता है –

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