2010-02-01 16 views
10

मैं अजगर में एक बहुत ही अजीब मुद्दे पर आया हूं। (अजगर 2.4.x का उपयोग करना)पायथन राउंडिंग मुद्दा

खिड़कियों में:

>>> a = 2292.5 
>>> print '%.0f' % a 
2293 

लेकिन सोलारिस में:

>>> a = 2292.5 
>>> print '%.0f' % a 
2292 

लेकिन यह दोनों खिड़कियों और सोलारिस में एक ही है:

>>> a = 1.5 
>>> print '%.0f' % a 
2 

क्या कोई इस व्यवहार को समझा सकता है? मैं अनुमान लगा रहा हूं कि इस प्लेटफॉर्म पर निर्भर किया गया है कि पाइथन संकलित किया गया था?

+0

नोट का इस्तेमाल किया है कि आप लगातार सहज ज्ञान युक्त "दौर शून्य से दूर प्राप्त करना चाहते हैं, तो "व्यवहार, आप C99/POSIX.1-2001 फ़ंक्शन" राउंडफ "का उपयोग कर सकते हैं। मुझे यकीन नहीं है कि इसके लिए पाइथन में बाइंडिंग हैं, या यदि यह विंडोज़ में उपलब्ध है; यदि यह आपके लिए महत्वपूर्ण है, तो आप आसानी से एक तृतीय-पक्ष कार्यान्वयन को शामिल करने के लिए सी मॉड्यूल लिख सकते हैं। –

उत्तर

10

अंततः फ़ंक्शनिंग करने का प्रभारी फ़ंक्शन PyOS_snprintf (the sources देखें)। जैसा कि आप अनुमान लगाते हैं, दुर्भाग्यवश सिस्टम-निर्भर है, यानी, यह vsprintf, vsnprintf या प्लेटफॉर्म के सी रनटाइम लाइब्रेरी द्वारा अंततः आपूर्ति किए जाने वाले अन्य समान कार्यों पर निर्भर करता है (मुझे याद नहीं है कि सी मानक '% f' के बारे में कुछ भी कहता है या नहीं। फ्लोट्स के लिए स्वरूपण जो दो संभव गोलाकार मूल्यों के बीच "बिल्कुल मिडवे" हैं ... लेकिन, क्या सी मानक इस बारे में ढीला है, या सी मानक मानक है लेकिन कुछ सी रनटाइम इसे तोड़ते हैं, आखिरकार यह एक सुंदर अकादमिक मुद्दा है .. ।)।

+3

मेरा मानना ​​है कि पिछला अंक तब भी होता है जब पिछले अंक भी होता है और जब यह अजीब –

+0

gnibbler होता है तो आप गोल करते हैं - आपने मेरा दिमाग –

+1

@gnibbler को उड़ा दिया है, यह एक अच्छा लेखांकन नियम है (यहां तक ​​कि कुछ अधिकार क्षेत्र में कानून द्वारा अनिवार्य है , मुझे लगता है) - लेकिन फिर लेखांकन हमेशा दशमलव-आधारित संख्याओं के साथ किया जाता है, ** ** ** बाइनरी फ्लोट नहीं, इसलिए फ्लोट के संदर्भ में यह कुछ हद तक म्यूट हो जाता है ;-)। –

0

मैं प्लेटफार्म निर्भर है। आप प्रलेखन here पा सकते हैं।

यह उपयोगकर्ता ceil या floor के लिए अच्छा है जब आप जानते हैं कि आप क्या चाहते हैं (ऊपर या नीचे)।

2

दौर() निकटतम सम पूर्णांक
"% n.nf" दौर के रूप में उसी तरह काम करता की ओर दौर()
पूर्णांक() शून्य

की ओर ट्रंकेटस "निकटतम पूर्णांक के लिए एक सकारात्मक संख्या गोलाई
0.5 जोड़ने और छोटा "
द्वारा कार्यान्वित किया जा सकता है - http://en.wikipedia.org/wiki/Rounding

अजगर में आप के साथ ऐसा कर सकते हैं: math.trunc(n + 0.5)
संभालने n सकारात्मक ओ है च पाठ्यक्रम ...

कहाँ "दौर आधे से भी" नहीं उचित है, मैं अब का उपयोग
math.trunc(n + 0.5) मैं कहाँ उपयोग करने के लिए int(round(n))

+0

दरअसल, अजगर निकटतम भी पूर्णांक की तरफ गोल नहीं करता है: 'यदि दो गुणक समान रूप से करीब हैं, तो गोल 0 से दूर किया जाता है (उदाहरण के लिए, गोल (0.5) 1.0 और राउंड (-0.5) -1.0 है) । '[डॉक्टर] (http://docs.python.org/2/library/functions.html#round) – ford

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