पायथन 2.7 में दो दशमलव स्थानों पर गोलाई?


84

पायथन 2.7 का उपयोग करते हुए मैं 10 या इसके बजाय दो दशमलव स्थानों पर अपनी संख्याओं को कैसे गोल करूं?

print "financial return of outcome 1 =","$"+str(out1)

2
यह कीड़े का एक कैन हो सकता है। क्या आप एक फ़्लोटिंग पॉइंट वैरिएबल में वित्तीय डेटा स्टोर कर रहे हैं और अब इसे राउंड करना चाहते हैं? ज्यादातर मामलों में सटीक राउंडिंग संभव नहीं है। आप पूर्णांक या Decimals का उपयोग करना चाह सकते हैं , यह इस बात पर निर्भर करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं।
टिम पिएत्जेकर

प्रारूप विनिर्देशक के बारे में जानें। आप सीधे फ्लोट मानों को प्रिंट कर सकते हैं, उन्हें स्ट्रिंग्स में कनवर्ट किए बिना।
जॉन डो

जवाबों:


201

अंतर्निहित फ़ंक्शन का उपयोग करें round():

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

या अंतर्निहित समारोह format():

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

या नई शैली स्ट्रिंग स्वरूपण:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

या पुरानी शैली स्ट्रिंग स्वरूपण:

>>> "%.2f" % (1.679)
'1.68'

मदद पर round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
दशमलव के साथ काम करते समय स्ट्रिंग प्रारूपण विधि उपयोगी होती है। जैसेDecimal("{:.2f}".format(val))
पैच रिक वाल्श

@PatchRickWalsh या बस Decimal(format(val, '.2f'))
अश्विनी चौधरी

9
ठंडा! मुझे उस प्रारूप के बारे में पता नहीं था। अधिक खोज करने के बाद, मुझे लगता है कि यह गोलाई का सबसे सटीक तरीका है यदि फ्लोटिंग पॉइंट त्रुटियां बिल्कुल स्वीकार्य नहीं हैं: Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)आपको देता है Decimal('123.35')। दूसरी ओर Decimal(format(Decimal('123.345'), '.2f'))आपको देता है Decimal('123.34')क्योंकि 123.345 का बाइनरी प्रतिनिधित्व 123.345 से कम है।
पैच रिक वाल्श

48

चूंकि आप वित्तीय आंकड़ों के बारे में बात कर रहे हैं , आप फ्लोटिंग-पॉइंट अंकगणित का उपयोग नहीं करना चाहते हैं । आप दशमलव का उपयोग करके बेहतर हैं।

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

नई शैली के साथ पाठ आउटपुट स्वरूपण format()(अर्ध-समतल गोलाई के लिए चूक):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

फ्लोटिंग-पॉइंट इंप्रेशन के कारण गोलाई में अंतर देखें:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

वित्तीय मूल्यों को गोल करने का उचित तरीका :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

विभिन्न लेन-देन में अन्य प्रकार की गोलाई होना भी आम है:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

याद रखें कि यदि आप रिटर्न परिणाम का अनुकरण कर रहे हैं, तो संभवतः आपको प्रत्येक ब्याज अवधि में गोल करना होगा, क्योंकि आप प्रतिशत अंशों का भुगतान / प्राप्त नहीं कर सकते हैं, न ही प्रतिशत अंशों पर ब्याज प्राप्त कर सकते हैं। सिमुलेशन के लिए यह स्वाभाविक है कि केवल अंतर्निहित अनिश्चितताओं के कारण फ्लोटिंग-पॉइंट का उपयोग करें, लेकिन यदि ऐसा करते हैं, तो हमेशा याद रखें कि त्रुटि है। इस तरह, नियत-ब्याज निवेश भी इस वजह से रिटर्न में थोड़ा भिन्न हो सकता है।


5

आप भी उपयोग कर सकते हैं str.format():

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

जब पेनीज़ / पूर्णांक के साथ काम कर रहे हों। आप 115 ($ 1.15 में) और अन्य संख्याओं के साथ एक समस्या में चलेंगे।

मेरे पास एक समारोह था जो एक इंटेगर को एक फ्लोट में बदल देगा।

...
return float(115 * 0.01)

वह ज्यादातर समय काम करता था लेकिन कभी-कभी कुछ ऐसा होता था 1.1500000000000001

इसलिए मैंने इस तरह से लौटने के लिए अपने कार्य को बदल दिया ...

...
return float(format(115 * 0.01, '.2f'))

और वह लौट आएगा 1.15। नहीं ( '1.15'या 1.1500000000000001एक फ्लोट देता है, एक स्ट्रिंग नहीं)

मैं ज्यादातर इसे पोस्ट कर रहा हूं इसलिए मुझे याद है कि मैंने इस परिदृश्य में क्या किया क्योंकि यह Google में पहला परिणाम है।


जैसा कि एक अन्य जवाब में कहा गया है, वित्तीय आंकड़ों के लिए दशमलव संख्याओं का उपयोग करें, न कि तैरने के लिए।
ब्रूनो ले फ्लोच

1
मैंने पूर्णांक के लिए सब कुछ परिवर्तित करना समाप्त कर दिया। इसके साथ काम करना बहुत आसान लगता है। हालाँकि, मैं ऐसा कुछ नहीं कर रहा था जो पेनीज़ के अंशों से संबंधित हो।
तेवुआने

2

मुझे लगता है कि सबसे अच्छा, प्रारूप () फ़ंक्शन का उपयोग करना है:

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

लेकिन मेरा कहना है: वित्तीय मूल्यों के साथ काम करते समय गोल या प्रारूप का उपयोग न करें।


formatएफ प्रारूप के लिए गैर-स्ट्रिंग की आवश्यकता है। अगर आपको ValueError नहीं मिली। सही कोड है: format(out1, '.2f')स्ट्रिंग के लिए कास्टिंग के बिना
डेनियस 23

2

जब हम राउंड () फ़ंक्शन का उपयोग करते हैं, तो यह सही मान नहीं देगा।

आप इसका उपयोग करके देख सकते हैं, राउंड (2.735) और राउंड (2.725)

इस्तेमाल करें

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

कृपया एक उदाहरण जोड़ें जिसे आपने परीक्षण किया था, परिणाम और आपको क्या लगता है उनके साथ गलत है।
लिरन फुनारो

आयात गणित संख्या = इनपुट ('एक संख्या दर्ज करें') संख्या = फ्लोट (गोल (संख्या, 2)) प्रिंट संख्या
मिधुन एमएम


0

बल्कि साधारण वर्कअराउंड फ्लोट को पहले स्ट्रिंग में बदलना है, पहले चार नंबरों के विकल्प का चयन करें, आखिर में फ्लोट को वापस ले जाना। उदाहरण के लिए:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

सुपर कुशल नहीं हो सकता है लेकिन सरल और काम करता है :)


2
यह विधि बहुत अविश्वसनीय है। यदि आपके मान में दशमलव बिंदु से पहले एक से अधिक अंक हैं, तो आपको दो वांछित दशमलव स्थान नहीं मिलते हैं। एक नकारात्मक संख्या के साथ एक ही समस्या।
आंद्रे कुल्हमन

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