मैं फ़्लोटिंग पॉइंट होने के लिए विभाजन को कैसे बाध्य कर सकता हूं? डिवीजन 0 से नीचे चक्कर लगाता रहता है?


721

मेरे पास दो पूर्णांक मान हैं aऔर b, लेकिन मुझे फ्लोटिंग पॉइंट में उनके अनुपात की आवश्यकता है। मुझे पता है कि a < bऔर मैं गणना करना चाहता हूं a / b, इसलिए यदि मैं पूर्णांक विभाजन का उपयोग करता हूं तो मुझे हमेशा शेष के साथ 0 मिलेगा a

मैं cनिम्नलिखित में पायथन में एक फ्लोटिंग पॉइंट नंबर बनने के लिए कैसे मजबूर कर सकता हूं ?

c = a / b

बस पायथन 3. में अपग्रेड करें
बोरिस

जवाबों:


807

पायथन 2 में, दो ints का विभाजन एक int पैदा करता है। पायथन 3 में, यह एक फ्लोट का उत्पादन करता है। से आयात करके हम नया व्यवहार प्राप्त कर सकते हैं __future__

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

13
ध्यान दें कि from __future__ import divisionफ़ाइल की बहुत शुरुआत में होना चाहिए
yannis

इसके अलावा समस्या यह है कि यदि आप एक स्थान पर पूर्णांक विभाजन चाहते हैं, लेकिन फाइल के किसी अन्य स्थान पर फ्लोट डिवीजन ...
मरकरी0114

1
@ पारा ०११४: समस्या नहीं; //जब आप फर्श विभाजन चाहते हैं, और /जब आप "सही" ( float) विभाजन चाहते हैं , तब आप उपयोग करते हैं ।
शैडो रेंजर

715

आप कर के तैरने के लिए कास्ट कर सकते हैं c = a / float(b)। यदि अंश या हर एक फ्लोट है, तो परिणाम भी होगा।


एक चेतावनी: जैसा कि टिप्पणीकारों ने बताया है, यह काम नहीं करेगा यदि bकोई पूर्णांक या फ्लोटिंग-पॉइंट संख्या (या एक स्ट्रिंग का प्रतिनिधित्व करने वाला) के अलावा कुछ और हो सकता है। यदि आप अन्य प्रकारों (जैसे कि जटिल संख्या) के साथ काम कर रहे हैं, तो आपको उन लोगों के लिए जाँच करनी होगी या एक अलग विधि का उपयोग करना होगा।


195

मैं पायथन में फ्लोटिंग पॉइंट होने के लिए विभाजन को कैसे बाध्य कर सकता हूं?

मेरे दो पूर्णांक मान हैं a और b, लेकिन मुझे फ्लोटिंग पॉइंट में उनके अनुपात की आवश्यकता है। मुझे पता है कि एक <b और मैं a / b की गणना करना चाहता हूं, इसलिए यदि मैं पूर्णांक विभाजन का उपयोग करता हूं तो मुझे हमेशा शेष 0 के साथ मिलेगा।

मैं निम्नलिखित में पायथन में फ्लोटिंग पॉइंट नंबर होने के लिए कैसे बाध्य कर सकता हूं?

c = a / b

यहाँ वास्तव में क्या पूछा जा रहा है:

"मैं सच्चे विभाजन को कैसे मजबूर करूं जो a / bएक अंश लौटाएगा?"

अजगर 3 को अपग्रेड करें

पायथन 3 में, सच्चे विभाजन को प्राप्त करने के लिए, आप बस करते हैं a / b

>>> 1/2
0.5

फर्श विभाजन, पूर्णांकों के लिए क्लासिक डिवीजन व्यवहार, अब है a // b:

>>> 1//2
0
>>> 1//2.0
0.0

हालाँकि, आप पायथन 2 का उपयोग करके अटक सकते हैं, या आप कोड लिख सकते हैं जो 2 और 3 दोनों में काम करना चाहिए।

यदि अजगर 2 का उपयोग कर रहा है

पायथन 2 में, यह इतना सरल नहीं है। क्लासिक पायथन 2 डिवीजन से निपटने के कुछ तरीके दूसरों की तुलना में बेहतर और मजबूत हैं।

अजगर 2 के लिए सिफारिश

आप किसी भी मॉड्यूल में पायथन 3 डिवीजन व्यवहार को निम्न आयात के साथ प्राप्त कर सकते हैं:

from __future__ import division

जो तब पूरे मॉड्यूल में पायथन 3 स्टाइल डिवीजन को लागू करता है। यह किसी भी बिंदु पर अजगर के खोल में काम करता है। पायथन 2 में:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

यह वास्तव में सबसे अच्छा समाधान है क्योंकि यह सुनिश्चित करता है कि आपके मॉड्यूल में कोड पायथन 3 के साथ संगत है।

पायथन 2 के अन्य विकल्प

यदि आप इसे पूरे मॉड्यूल पर लागू नहीं करना चाहते हैं, तो आप कुछ वर्कअराउंड तक सीमित हैं। सबसे लोकप्रिय में से एक फ्लोट के लिए ऑपरेंड में से एक को ज़बरदस्ती करना है। एक मजबूत उपाय है a / (b * 1.0)। एक ताजा अजगर खोल में:

>>> 1/(2 * 1.0)
0.5

मॉड्यूल truedivसे भी मजबूत है , लेकिन यह संभावना धीमी है क्योंकि यह एक फ़ंक्शन कॉल है:operatoroperator.truediv(a, b)

>>> from operator import truediv
>>> truediv(1, 2)
0.5

पायथन 2 के लिए अनुशंसित नहीं

आमतौर पर देखा जाता है a / float(b)। यदि बी एक जटिल संख्या है, तो यह TypeError बढ़ाएगा। चूंकि जटिल संख्याओं के साथ विभाजन को परिभाषित किया गया है, इसलिए यह मुझे समझ में आता है कि विभाजक के लिए एक जटिल संख्या पारित होने पर विभाजन विफल नहीं होना चाहिए।

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

यह मेरे लिए उद्देश्यपूर्ण तरीके से आपके कोड को अधिक भंगुर बनाने के लिए बहुत मायने नहीं रखता है।

आप -Qnewध्वज के साथ पायथन भी चला सकते हैं , लेकिन इसमें नए पायथन 3 व्यवहार के साथ सभी मॉड्यूल को निष्पादित करने का नकारात्मक पहलू है, और आपके कुछ मॉड्यूल क्लासिक विभाजन की उम्मीद कर सकते हैं, इसलिए मैं परीक्षण के अलावा इसकी अनुशंसा नहीं करता। लेकिन प्रदर्शित करने के लिए:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

3
"1 // 2 = 0", "1 // 2.0 = 0.0" - दिलचस्प थोड़ा गौचा, भले ही यह एक पूर्णांक विभाजन है, यदि कोई ऑपरेंड फ्लोट है, तो परिणाम पूरी संख्या है, लेकिन फ्लोट भी है। मैं एक सूची सूचकांक की गणना करने के लिए पूर्णांक विभाजन का उपयोग कर रहा था और उसी के कारण त्रुटि हो रही थी।
आर। नवेगा


66

पायथन 3.x में, एकल स्लैश ( /) का अर्थ हमेशा सही (गैर-ट्रंचिंग) विभाजन होता है। ( //ऑपरेटर का उपयोग विभाजन को रौंदने के लिए किया जाता है।) पायथन में 2.x (2.2 और ऊपर), आप एक डाल के समान व्यवहार प्राप्त कर सकते हैं

from __future__ import division

अपने मॉड्यूल के शीर्ष पर।


30

फ्लोटिंग-पॉइंट फॉर्मेट में विभाजन के लिए कोई भी पैरामीटर बनाने से फ्लोटिंग-पॉइंट में आउटपुट भी उत्पन्न होता है।

उदाहरण:

>>> 4.0/3
1.3333333333333333

या,

>>> 4 / 3.0
1.3333333333333333

या,

>>> 4 / float(3)
1.3333333333333333

या,

>>> float(4) / 3
1.3333333333333333

4
लेकिन आप बाद में करना करने के लिए परीक्षा हो सकती है 1.0 + 1/3या float(c) + a/bया float(a/b)और आप जवाब से निराश हो जाएगा। अजगर 3+ का उपयोग करने या __future__.divisionमॉड्यूल को आयात करने के लिए बेहतर है , (स्वीकृत उत्तर देखें), हमेशा उस उत्तर को प्राप्त करने के लिए जिसे आप उम्मीद करते हैं। मौजूदा डिवीजन नियम कठिन, कठिन-से-ट्रेस गणित त्रुटि बनाते हैं।
हॉब्स

@JoeCondron क्या आपने कोशिश की python -c 'a=10; b=3.0; print a/b'?
gsbabil

मुझे ऐसा नहीं करना पड़ा क्योंकि यह स्पष्ट रूप से इस परिदृश्य में काम करता है। हालांकि, क्या होगा अगर aऔर 'बी', उदाहरण के लिए, एक पूर्णांक-मूल्य फ़ंक्शन के आउटपुट हैं? जैसे a = len(list1), b = len(list2),।
जोकॉन्ड्रोन

@ जोएकॉनड्रॉन: अच्छी बात है। मैंने सिर्फ शामिल करने के उत्तर को अपडेट किया float(..)। मुझे लगता है कि गुणा करने के लिए 1.0, जैसा कि @Pinochle ने सुझाव दिया है, उपयोगी भी हो सकता है।
gsbabil

21

.फ्लोटिंग पॉइंट नंबरों को इंगित करने के लिए एक डॉट ( ) जोड़ें

>>> 4/3.
1.3333333333333333

2
यदि आप अंश और भाजक दोनों चर हैं, तो आप इस दृष्टिकोण को कैसे लागू करेंगे?
stackoverflowuser2010

मुझे लगता है कि आप पहले उदाहरण का उल्लेख करते हैं, यदि ऐसा है, तो मैं बस float()एक चर पर उपयोग करूंगा ।
अलेक्जेंडर

13

यह भी चलेगा

>>> u=1./5
>>> print u
0.2

4
और यदि आप अंश और हर दो प्रकार के होते हैं, तो आप इस दृष्टिकोण को कैसे लागू करेंगे?
stackoverflowuser2010

1
क्योंकि यह तब काम नहीं करता है जब चर का उपयोग अमूर्तता के लिए किया जाता है। लगभग कोई भी सार्थक कोड उस तरह के हार्डकोड नहीं है।
कीर सीमन्स

1
इसके पास बहुत कम वोट हैं क्योंकि यह उत्तर प्रश्न का उत्तर नहीं देता है, और सामान्य उत्तर नहीं है। एक जवाब में यह दिखाना भी महत्वपूर्ण है कि यह क्यों काम करता है। यह बहुत सरल है: यदि अंश या हर एक फ्लोट है, तो परिणाम एक फ्लोट होगा। आमतौर पर आप एक सादा कैलकुलेटर के रूप में अजगर का उपयोग नहीं करते हैं, इसलिए आप चर के लिए एक उत्तर चाहते हैं aऔर b
टिमजमैन

सबसे लंबे समय के लिए, मैंने वास्तव में सोचा ./था कि अजगर में एक वैध ऑपरेटर था जो आपको फ्लोटिंग पॉइंट डिवीजन करने की अनुमति देता है। यही कारण है कि सफेद स्थान का उपयोग विवेकपूर्ण तरीके से, किसी भी प्रोग्रामिंग भाषा में
smac89

6

यदि आप डिफ़ॉल्ट रूप से "ट्रू" (फ्लोटिंग पॉइंट) डिवीजन का उपयोग करना चाहते हैं, तो कमांड लाइन का झंडा है:

python -Q new foo.py

कुछ कमियां हैं (पीईपी से):

यह तर्क दिया गया है कि डिफ़ॉल्ट को बदलने के लिए एक कमांड लाइन विकल्प बुराई है। यह गलत हाथों में निश्चित रूप से खतरनाक हो सकता है: उदाहरण के लिए, 3-पार्टी लाइब्रेरी पैकेज को संयोजित करना असंभव होगा, जिसमें एक-दूसरे के साथ -new की आवश्यकता होती है -Qold।

आप अन्य झंडे मूल्यों के बारे में अधिक जान सकते हैं जो अजगर आदमी पृष्ठ को देखते हुए विभाजन के व्यवहार को बदलते / चेतावनी देते हैं।

डिवीजन परिवर्तन पर पूर्ण विवरण के लिए पढ़ें: पीईपी 238 - डिवीजन ऑपरेटर को बदलना


2
from operator import truediv

c = truediv(a, b)

2
हालांकि, यह आदर्श नहीं है, क्योंकि यह उस मामले में काम नहीं करता है जहां aएक अंतर है और bएक फ्लोट है। एक ही लाइनों के साथ एक बेहतर समाधान करना है from operator import truedivऔर फिर उपयोग करना है truediv(a, b)
मार्क डिकिंसन

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

1
from operator import truediv

c = truediv(a, b)

जहां एक लाभांश है और बी भाजक है। यह कार्य तब आसान होता है जब दो पूर्णांकों के विभाजन के बाद भागफल एक फ्लोट होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.