2015-11-25 13 views
9

मुझे दो संख्याओं को विभाजित करके एक फ्लोट मिलता है। मुझे पता है कि संख्याएं विभाजित हैं, इसलिए मेरे पास हमेशा एक पूर्णांक होता है, केवल यह प्रकार की फ्लोट है। हालांकि, मुझे एक वास्तविक int प्रकार की आवश्यकता है। मुझे पता है कि int() decimals स्ट्रिप्स (यानी, फर्श दौर)। मुझे चिंतित है कि चूंकि फ्लोट सटीक नहीं हैं, अगर मैं ऐसा करता हूं। int(12./3) या int(round(12./3)) यह 4 के बजाय 3 के रूप में समाप्त हो सकता है क्योंकि 4 का फ्लोटिंग पॉइंट प्रस्तुति 3.99 99 999593519561 हो सकता है (यह सिर्फ एक उदाहरण नहीं है)।हमेशा एक निकटतम पूर्णांक वापस करने के लिए एक "पूर्णांक" फ्लोट कास्टिंग करेगा?

क्या यह कभी होगा और क्या मैं यह सुनिश्चित कर सकता हूं कि यह नहीं है?

(मैं पूछ रहा हूँ क्योंकि, जबकि एक numpy सरणी देगी, मैं एक चेतावनी कह रही है कि आकार पूर्णांकों, नहीं तैरता होना चाहिए मिला है।)

+4

आप इंटीजर डिवीजन का उपयोग क्यों नहीं करते? – lejlot

+0

हाँ मैंने पोस्ट करने के ठीक बाद उस बारे में सोचा था। सवाल को अपडेट करने वाला था, लेकिन मैं आपकी टिप्पणी को इसके बजाय बात करने दूँगा। – cmeeren

+0

हालांकि, अगर मैं उदा। 3.5/0.5 तो यह संभव नहीं है। (मैं नहीं करता, मैं दो पूर्णांक विभाजित करता हूं, लेकिन तर्क के लिए ...) – cmeeren

उत्तर

4

कास्टिंग एक float के लिए एक integer मूल्य ट्रंकेटस है, तो आप 3.999998 अगर , और आप इसे integer पर डाल देते हैं, तो आपको 3 मिलता है।

इसे रोकने का तरीका परिणाम को गोल करना है। int(round(3.99998)) = 4, चूंकि गोल फ़ंक्शन हमेशा एक सटीक अभिन्न मान देता है।

+0

जब यह फ़्लोट लौटाता है तो राउंड फ़ंक्शन एक सटीक अभिन्न मूल्य कैसे लौटा सकता है? – cmeeren

+0

एक फ्लोट सीमित लंबाई के साथ दशमलव संख्या की तरह है, अंक 0-9 के बजाय बाइनरी अंकों को छोड़कर। यह 3453.0 की तरह, पूर्णांक मानों को ठीक से पकड़ सकता है।ऐसी कई संख्याएं हैं जो ठीक से नहीं रख सकती हैं, जैसे 1/3 = 0.3333 ..., क्योंकि इसकी लंबाई सीमित है। –

+1

@cmeeren: इस उत्तर का जोर सही है, ** आपके निर्दिष्ट प्रश्न ** के लिए। यह सच है कि 'राउंड' "अंतर्ज्ञानी" नतीजे नहीं देगा जहां फ्लोट वैल्यू राउंडिंग सीमा के करीब है, जैसे 'राउंड (2.675, 2)' (यह उदाहरण दस्तावेज में सही है)। लेकिन आपका प्रश्न विशेष रूप से निर्धारित करता है कि आप जानते हैं कि आपके मूल्य अभिन्न अंग होना चाहिए, और ये उम्मीद के अनुसार दौर में होंगे। –

1

राउंडिंग को मूल्य में मूल्य में 0.5 जोड़कर अनुकरण किया जा सकता है। उदाहरण के लिए:

>>> int(3.4) 
3 
>>> int(3.7) 
3 
>>> int(3.4 + 0.5) # 3.9 
3 
>>> int(3.7 + 0.5) # 4.2 
4 
+0

सी में, एक संख्या के चारों ओर 0.5 जोड़ने के लिए असफल 1) कई नकारात्मक संख्याएं, 2) संख्या 0.5 से छोटी, 3) 0.5 के यूएलपी के साथ कई 'फ्लोट' नौकाएं) 1.0 के यूएलपी के साथ कई 'फ्लोट' मान। अजगर के साथ समान परेशानियों पर संदेह है। – chux

+0

इनमें से कोई भी विशेष मामला ओपी के कोड द्वारा उत्पन्न नहीं होता है। – chepner

1

मैं पूर्णांक प्रभाग (a//b) का उपयोग कर के बाद से मैं पूर्णांकों विभाजित समाप्त हो गया। अगर मैंने विभाजित किया तो काम नहीं किया होता 3.5/0.5 = 7 हालांकि।

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