2008-09-11 14 views
93

round() फ़ंक्शन के लिए दस्तावेज़ यह बताता है कि आप इसे एक संख्या पास करते हैं, और दशमलव को दशमलव के चारों ओर स्थित करते हैं। इस प्रकार यह इस करना चाहिए:राउंड() पाइथन में ठीक से गोलाकार नहीं लग रहा है

n = 5.59 
round(n, 1) # 5.6 

लेकिन, वास्तविकता में, अच्छे पुराने फ्लोटिंग बिंदु weirdness में ढोंगी और आपको मिलता है:

5.5999999999999996 

यूआई के प्रयोजनों के लिए, मैं 5.6 प्रदर्शित करने के लिए की जरूरत है। मैंने इंटरनेट के चारों ओर पोक किया और कुछ documentation पाया कि यह पायथन के कार्यान्वयन पर निर्भर है। दुर्भाग्यवश, यह मेरी विंडोज़ देव मशीन और प्रत्येक लिनक्स सर्वर पर मैंने कोशिश की है। See here also

अपनी खुद की राउंड लाइब्रेरी बनाने का छोटा, क्या इसके आसपास कोई रास्ता है?

+2

मैं अजगर 2.7.11 दौर (5.59) के साथ इस की कोशिश की और यह के रूप में परिणाम दे रहा है 5.6 दोनों विंडोज़ और लिनक्स x86 64 बिट मशीन, साइथन में? (दस्तावेज लिंक का उल्लेख अब बदला गया है) –

+0

जहां यह वास्तव में सही ढंग से काम नहीं करता है 'राउंड (5.55, 1) = 5.5' है। – Dmitry

उत्तर

88

जिस तरह से यह संग्रह किया गया है मदद नहीं कर सकता, लेकिन कम से कम स्वरूपण सही ढंग से काम करता है:

'%.1f' % round(n, 1) # gives you '5.6' 
+5

मैंने 'प्रिंट '% .2f'% 655.665' की कोशिश की लेकिन यह' 655.66' लौटा, यह '655.67' – Kyrie

+1

@Kyrie होना चाहिए http://stackoverflow.com/questions/9301690/python-float-round-error- 117-285 राउंड-टू-117-28-नहीं-117-29। फ़्लोटिंग पॉइंट गलतता यहां दोष देना है - "5.665 -> 5.67" लेकिन "15.665 -> 15.66"। यदि आपको सटीक सटीकता की आवश्यकता है तो दशमलव का उपयोग करें। – Jimmy

+5

यह खोज के बाद काम कर रहा है :) 'दशमलव आयात दशमलव से, ROUND_HALF_UP, ROUND_HALF_DOWN' # गोलाकार संख्या ' दशमलव (str (655.665)) का उपयोग करें। मात्रा (दशमलव ('1.11'), राउंडिंग = ROUND_HALF_UP) '# मुद्दे और फ्लोटिंग पॉइंट्स में सीमाएं – Kyrie

-4

के बारे में क्या:

round(n,1)+epsilon 
+0

यह केवल तभी काम करेगा जब गोलिंग ईपीएसलॉन द्वारा गोल संख्या से लगातार बंद हो। यदि 'epsilon = .000001' तो 'राउंड (1.0/5.0, 1) + ईपीएसलॉन सटीक प्रतिनिधित्व 0.2 ले जाएगा और इसे 0.00001 बना देगा। ईपीएसलॉन गोल समारोह के अंदर थे, तो भी उतनी ही बुरी समस्याएं होती हैं। –

7

आप एक पूर्णांक के लिए डेटा प्रकार बदल सकते हैं:

>>> n = 5.59 
>>> int(n * 10)/10.0 
5.5 
>>> int(n * 10 + 0.5) 
56 

और फिर लोकेल के दशमलव विभाजक डालने से संख्या प्रदर्शित करें।

हालांकि, Jimmy's answer बेहतर है।

+0

यह सबसे मजबूत विधि प्रतीत होता है! – buzhidao

3

आप स्ट्रिंग प्रारूप ऑपरेटर % का उपयोग कर सकते हैं, sprintf के समान।

mystring = "%.2f" % 5.5999 
11

आप मिल '5.6' अगर आप सिर्फ round(n, 1) के बजाय str(round(n, 1)) है।

5

फ़्लोटिंग पॉइंट गणित मामूली, लेकिन कष्टप्रद, परिशुद्धता त्रुटियों के लिए कमजोर है। यदि आप पूर्णांक या निश्चित बिंदु के साथ काम कर सकते हैं, तो आपको सटीक गारंटी दी जाएगी।

3

printf चूसने वाला।

print '%.1f' % 5.59 # returns 5.6 
92

प्रारूपण सही ढंग से भी दौर के बिना काम करता है:

"%.1f" % n 
+11

[डॉक्स] के अनुसार (https://docs.python.org/3.2/tutorial/inputoutput.html#old-string-formatting), स्ट्रिंग स्वरूपण की यह शैली अंततः चली जाएगी। नया स्टाइल प्रारूप '" {: .1f} "होगा। प्रारूप (एन)' – whereswalden

+1

सही ढंग से गोल नहीं करता है: '% .5f'% 0.988625' '0.98862' – schlamar

+0

@ स्क्लामर देता है: यह दौर() है व्यवहार भी: दौर (0.988625,5) भी 0.98862 देता है। दौर (0.988626,5) के साथ-साथ "% .5f"% 0.988626 0.98863 –

18

round(5.59, 1) ठीक काम कर रहा है। समस्या यह है कि 5.6 को बाइनरी फ्लोटिंग पॉइंट में बिल्कुल प्रदर्शित नहीं किया जा सकता है।

>>> 5.6 
5.5999999999999996 
>>> 

Vinko कहते हैं, आप प्रदर्शन के लिए गोलाई करने के लिए स्वरूपण स्ट्रिंग का उपयोग कर सकते हैं।

यदि आपको इसकी आवश्यकता है तो पाइथन के पास module for decimal arithmetic है। कंप्यूटर एक प्रदान करनी चाहिए -

+1

की अपेक्षा नहीं है पाइथन 2.7 या पायथन 3.5 – vy32

4

Decimal module

दशमलव पर एक नजर डालें "एक फ्लोटिंग प्वाइंट मॉडल है जो लोगों के मन में साथ डिजाइन किया गया था, और जरूरी एक सर्वोपरि मार्गदर्शक सिद्धांत है पर आधारित है अंकगणित जो अंकगणित के समान काम करता है जो लोग स्कूल में सीखते हैं। "- दशमलव अंकगणितीय विनिर्देश से अंश।

और

दशमलव संख्या वास्तव में दर्शाया जा सकता है। इसके विपरीत, 1.1 और 2.2 जैसी संख्याएं बाइनरी फ़्लोटिंग बिंदु में सटीक प्रस्तुतियां नहीं हैं। अंत उपयोगकर्ता आमतौर पर 3.3000000000000003 के रूप में प्रदर्शित करने के लिए 1.1 + 2.2 की अपेक्षा नहीं करेंगे क्योंकि यह बाइनरी फ़्लोटिंग पॉइंट के साथ करता है।

दशमलव संचालन है कि यह आसान है कि चल बिन्दु आपरेशनों की आवश्यकता होती है और भी एक मानव पठनीय प्रारूप, उदाहरण के लिए, लेखांकन में उन परिणामों को पेश करने की जरूरत है क्षुधा लिखने के लिए बनाने की तरह प्रदान करता है।

19

यदि आप दशमलव मॉड्यूल का उपयोग करते हैं तो आप 'राउंड' फ़ंक्शन के उपयोग के बिना अनुमान लगा सकते हैं। यहाँ है कि मैं क्या विशेष रूप से गोलाई जब मौद्रिक अनुप्रयोगों लिखने के लिए प्रयोग कर रहे है:

Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP) 

यह एक दशमलव संख्या जो 16.20 है वापस आ जाएगी।

+0

के साथ अब एक समस्या है यह वास्तव में स्मार्ट जवाब है। – Rockallite

+2

** यह कैननिकल उत्तर ** है - जहां शुद्धता मायने रखती है, वैसे भी, जो हर जगह काफी सुंदर है। निश्चित: _it थोड़ा verbose_ है। लेकिन उस चूसने वाले को एक सहायक समारोह में फेंक दें और आप प्रारूपित और जाने के लिए अच्छे हैं। –

2

यह वास्तव में एक बड़ी समस्या है। इस कोड को आज़माएं:

print "%.2f" % (round((2*4.4+3*5.6+3*4.4)/8,2),) 

यह 4.85 प्रदर्शित करता है। फिर आप करते हैं:

print "Media = %.1f" % (round((2*4.4+3*5.6+3*4.4)/8,1),) 

और यह 4.8 दिखाता है। हाथ से आप गणनाएं करना सटीक उत्तर 4.85 है, लेकिन अगर आप का प्रयास करें:

print "Media = %.20f" % (round((2*4.4+3*5.6+3*4.4)/8,20),) 

तुम सच देख सकते हैं: नाव बिंदु अंशों जिसका हरों दो की शक्तियों रहे हैं के निकटतम परिमित राशि के रूप में संग्रहीत किया जाता है।

2

वर्क्स बिल्कुल सही

format(5.59, '.1f') # to display 
float(format(5.59, '.1f')) #to round 
1

मैं कर रहा हूँ:

int(round(x , 0)) 

इस मामले में, हम पहले दौर ठीक से इकाई के स्तर पर है, तो हम एक नाव मुद्रण से बचने के लिए पूर्णांक परिवर्तित।

तो

>>> int(round(5.59,0)) 
6 

मैं इस सवाल का जवाब स्ट्रिंग formating की तुलना में बेहतर काम करता है लगता है, और यह भी मेरे लिए अधिक Sens बनाता दौर समारोह का उपयोग करें।

0

यहां पर जहां मैं असफल दौर देखता हूं। क्या होगा यदि आप इन 2 संख्याओं को एक दशमलव स्थान पर ले जाना चाहते थे? 23.45 23.55 मेरे शिक्षा था कि इन गोलाई से आप मिलना चाहिए: 23.4 23.6 "नियम" किया जा रहा है कि आप, को ख़त्म कर देना चाहिए अगर पूर्ववर्ती संख्या अजीब था अगर पूर्ववर्ती संख्या भी थे को ख़त्म कर नहीं। अजगर में गोल समारोह बस ट्रंकेटस 5.

+1

आप किस बारे में बात कर रहे हैं ["बैंकर राउंडिंग"] (https://en.wikipedia.org/wiki/Rounding), गोल करने के कई अलग-अलग तरीकों में से एक है। –

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/188 9 57739) – Ilkka

0

कोड:

x1 = 5.63 
x2 = 5.65 
print(float('%.2f' % round(x1,1))) # gives you '5.6' 
print(float('%.2f' % round(x2,1))) # gives you '5.7' 

आउटपुट:

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